Typeorm - 基于实体的迁移

Posted

技术标签:

【中文标题】Typeorm - 基于实体的迁移【英文标题】:Typeorm - migrations based on entities 【发布时间】:2021-05-23 20:27:15 【问题描述】:

所以我将 typeorm 与 ormconfig.json 一起使用。 由于synchronize 无法在生产环境中使用,我该如何运行基于实体的迁移?

我的ormconfig.json 文件


    "type": "postgres",
    "host": "localhost",
    "port": 5432,
    "username": "",
    "password": "",
    "database": "backend-api",
    "synchronize": false,
    "logging": true,
    "migrationsRun": true,
    "entities": ["dist/entity/**/*.js"],
    "migrations": ["dist/migration/**/*.js"],
    "subscribers": ["dist/subscriber/**/*.js"],
    "cli": 
        "entitiesDir": "src/entity",
        "migrationsDir": "src/migration",
        "subscribersDir": "src/subscriber"
    

这里也是我唯一的Todo.ts实体文件

import 
    BaseEntity,
    Column,
    CreateDateColumn,
    Entity,
    PrimaryGeneratedColumn,
    UpdateDateColumn,
 from 'typeorm';

@Entity()
export class Todo extends BaseEntity 
    @PrimaryGeneratedColumn()
    id: number;

    @Column('text')
    text: string;

    @Column('boolean',  default: false )
    completed: boolean;

    @CreateDateColumn()
    createdAt: Date;

    @UpdateDateColumn()
    updatedAt: Date;

【问题讨论】:

【参考方案1】:

要基于entities 运行迁移,您可以从您的entities 生成migrations 文件,如TypeOrm documentation about generating migrations 中所述。

TypeORM 能够使用您所做的架构更改自动生成 迁移 文件。

运行此命令指定迁移的名称以生成文件:

typeorm migration:generate -n <MigrationName>

之后,您只需使用 CLI 运行您的迁移

typeorm migration:run

一个好的做法是在您的数据库配置中使用migrationsRun 参数以在启动时运行您的迁移

migrationsRun: true,

【讨论】:

在生成它时要求我创建一个迁移。但它不会从实体中获取 您是否在数据库配置中指定了实体和迁移的路径? 你的数据库是空的,没有任何表吗? TypeOrm 正在匹配您的实体和数据库之间的差异以生成缺少的表/列 我已经删除了数据库并创建了另一个,但还是一样 不要手动删除表,而是尝试运行typeorm schema:drop【参考方案2】:

找到了解决这个问题的办法。

所以我的ormconfig.json 需要稍微更新一下,


    "type": "postgres",
    "host": "localhost",
    "port": 5432,
    "username": "",
    "password": "",
    "database": "backend-api",
    "synchronize": false,
    "logging": true,
    "migrationsRun": false,
    "entities": ["src/entity/**/*.ts"],
    "migrations": ["src/migration/**/*.ts"],
    "subscribers": ["src/subscriber/**/*.ts"],
    "cli": 
        "entitiesDir": "src/entity",
        "migrationsDir": "src/migration",
        "subscribersDir": "src/subscriber"
    

我需要安装ts-node 来编译ts 实体和迁移文件。

我创建了以下提到的脚本:

"scripts": 
    "start": "ts-node src/index.ts",
    "entity:create": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm entity:create -n",
    "migrate:generate": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:generate -n",
    "migrate:run": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:run",
    "migrate:revert": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm migration:revert",
    "schema:drop": "./node_modules/.bin/ts-node ./node_modules/.bin/typeorm schema:drop"

并按照脚本的顺序。 我学到的一件事是你不能简单地创建一个实体文件并在其上运行migration:generate。您首先需要创建一个基于typeorm cli 的实体。我不知道为什么,但对我来说,一旦我开始使用 cli 创建实体,一切就到位了

【讨论】:

以上是关于Typeorm - 基于实体的迁移的主要内容,如果未能解决你的问题,请参考以下文章

TypeORM 生成空迁移

TypeORM 不会在由 TypeORM 创建的项目中生成迁移

TypeORM:尝试手动运行迁移时“没有待处理的迁移”

TypeORM CLI:未发现数据库架构更改

typeORM 未发现数据库架构更改 - 无法生成迁移。要创建新的空迁移,请使用“typeorm migration:create”命令

TypeORM - 如何在生产模式下创建新表并自动运行迁移?