TypeScript 中的数据库迁移:TypeORM、Prisma 和 Drizzle

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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.ts


TypeORM 的优缺点

  • 优点: 生态系统庞大,支持多种数据库(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

推荐