引言:为什么 TypeScript 和数据库是完美搭档
现代 Web 开发离不开数据库操作。TypeScript 作为 JavaScript 的强类型超集,为开发者提供了构建可靠、可扩展应用程序的强大工具。在本文中,我们将通过实践讲解如何在 TypeScript 生态系统中连接和使用两种最流行的数据库——关系型数据库 PostgreSQL 和文档型数据库 MongoDB。
您将学习如何配置 ORM/ODM、编写类型化模型以及执行基本的 CRUD 操作。本文面向已经熟悉 TypeScript 和 Node.js 基础的开发者。
1. 项目设置与依赖安装
在编写代码之前,我们先创建一个新项目并安装必要的包。对于 PostgreSQL,我们将使用 TypeORM——TypeScript 中最流行的 ORM 之一。对于 MongoDB,我们将使用 Mongoose。
项目初始化
mkdir typescript-db-practicecd typescript-db-practicenpm init -ynpm install typescript ts-node @types/node --save-devnpx tsc --init安装 PostgreSQL 依赖
npm install typeorm reflect-metadata pgnpm install @types/node --save-dev安装 MongoDB 依赖
npm install mongoosenpm install @types/mongoose --save-dev安装完成后,请务必在 tsconfig.json 文件中启用 "experimentalDecorators": true 和 "emitDecoratorMetadata": true 选项——它们是 TypeORM 运行所必需的。
2. 通过 TypeORM 操作 PostgreSQL
TypeORM 同时支持 Active Record 和 Data Mapper 模式。我们将采用 Data Mapper 模式,因为它提供了更大的灵活性,并且与整洁架构配合得更好。
创建实体 (Entity)
让我们创建一个用户模型。每个实体都是一个使用特殊注解装饰的类。
// src/entities/User.tsimport { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ length: 100 }) name: string;
@Column({ unique: true }) email: string;
@Column({ select: false }) password: string;
@CreateDateColumn() createdAt: Date;}配置连接与仓库
创建一个用于初始化数据库的文件,以及一个用于操作用户的仓库。
// src/data-source.tsimport "reflect-metadata";import { DataSource } from "typeorm";import { User } from "./entities/User";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "postgres", password: "password", database: "test_db", synchronize: true, // 自动创建表(仅用于开发环境!) logging: false, entities: [User], migrations: [], subscribers: [],});// src/repositories/userRepository.tsimport { AppDataSource } from "../data-source";import { User } from "../entities/User";
export const userRepository = AppDataSource.getRepository(User);CRUD 操作实战
// src/index.tsimport { AppDataSource } from "./data-source";import { userRepository } from "./repositories/userRepository";
async function main() { await AppDataSource.initialize(); console.log("PostgreSQL connected!");
// CREATE const newUser = userRepository.create({ name: "伊万·彼得罗夫", email: "ivan@example.com", password: "hashed_password" }); await userRepository.save(newUser); console.log("User created:", newUser);
// READ const us