TypeScript 中的数据库迁移:工具完整概述与实践指南
数据库迁移是一种对数据库模式变更(创建、修改或删除表、索引和约束)进行版本控制和顺序应用的方法。在 TypeScript 生态系统中,有几种强大的工具可用于管理迁移。在本文中,我们将详细分析三种最流行的解决方案:TypeORM、Prisma 和 Drizzle ORM。
为什么需要迁移?
如果没有迁移,开发者通常通过 SQL 控制台或管理界面手动进行更改,这会导致:
- 开发环境与生产环境之间失去同步;
- 人为因素导致的错误;
- 回滚更改困难。
迁移解决了这些问题,允许自动应用和回滚更改,并将所有模式变更的历史记录保存在代码中。
1. TypeORM——经典的 ActiveRecord 和 Data Mapper 方法
TypeORM 是 TypeScript 和 JavaScript 中最成熟的 ORM 之一。它支持 ActiveRecord 和 Data Mapper 两种模式,并内置了迁移系统。
安装与配置
npm install typeorm reflect-metadata @types/nodenpm install pg # 用于 PostgreSQL创建配置文件 ormconfig.json 或使用 data-source.ts:
import { DataSource } from "typeorm";
export const AppDataSource = new DataSource({ type: "postgres", host: "localhost", port: 5432, username: "user", password: "password", database: "mydb", entities: ["src/entity/*.ts"], migrations: ["src/migration/*.ts"], synchronize: false, // 关闭自动同步});创建与执行迁移
首先,根据实体中的变更生成迁移:
npx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts生成的迁移示例:
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export class AddUserTable1234567890 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.createTable( new Table({ name: "user", columns: [ { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" }, { name: "name", type: "varchar", length: "255" }, { name: "email", type: "varchar", isUnique: true }, ], }) ); }
public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.dropTable("user"); }}应用迁移:
npx typeorm migration:run -d src/data-source.tsTypeORM 的优缺点
- 优点: 生态系统庞大,支持多种数据库(PostgreSQL、MySQL、SQLite、MSSQL),可从实体生成迁移。
- 缺点: 配置复杂,实体数量多时运行速度慢,代码库陈旧。
2. Prisma——支持自动迁移的现代 ORM
Prisma 是 TypeScript ORM 的新标准。它使用声明式模式(schema.prisma)并自动生成迁移。
安装与初始化
npm install prisma @prisma/clientnpx prisma init在 prisma/schema.prisma 中定义模型:
generator client { provider = "prisma-client-js"}
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id