如何将TypeORM迁移文件压缩为一个文件

13

我的迁移文件变得相当大了,我想知道是否有一种方法可以使用TypeORM将迁移文件压缩成一个文件,而不需要使用纯SQL。

3个回答

1

你可以像0xCAP说的那样做。但是当新的迁移被创建时,你不应该在生产环境中运行它,因为所有的事情都已经完成了。 你可以使用--fake命令选项来伪造它,具体请参考typeorm documentation

typeorm migration:run --fake

这将标记迁移已完成而不执行它。

否则,你可以修改迁移路径的正则表达式。例如:

migrations: process.env.SKIP_MIGRATION ? ['${rootDir}/../migrations/!(mysquashedmigration){.ts,.js}'] : ['${rootDir}/../migrations/*{.ts,.js}'],

1
如果你想将现有的TypeORM迁移全部压缩到一个文件中,可以按照以下步骤操作(@Alexandre & @0xCAP提供的方法):
  1. 删除项目目录中所有现有的迁移(包括编译后的.js文件)。
  2. 确保本地数据库架构也为空(没有表)。
  3. 运行以下命令生成新迁移:typeorm migration:generate path/to/SquashedMigrations -d path/to/datasource
这将创建一个名为“12345678910-squashedmigrations.ts”的新迁移文件,其中包含您以前迁移的所有更改。
export class squashedMigrations12345678910 implements MigrationInterface {
    name = 'squashedMigrations12345678910'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query(`CREATE TABLE ...`);
  1. 将生成的迁移文件名称重命名为与您在生产环境中应用的最新迁移文件名称相匹配的名称。例如,如果您应用的最新迁移文件名称是“lastMigration1634532141863”,则您应该将“squashedMigrations12345678910”重命名为“lastMigration1634532141863”。
-- name = 'squashedMigrations12345678910'
++ name = 'lastMigration1634532141863'

请注意,当您将压缩迁移名称重命名为与您在生产环境中应用的最新迁移匹配时,TypeORM 将认为该迁移已经应用,并且即使没有使用 --fake 选项,也不会再次执行它。因此,在这种情况下,您不需要使用 --fake
这种方法假设您没有在 TypeORM 迁移之外对生产数据库架构进行任何更改。如果不是这种情况,则需要确保在运行压缩迁移之前手动合并任何更改。(例如:触发器、SQL 函数等)

谢谢。这种方法很有道理。此外,我认为除了最后一行之外,从“迁移”表中删除所有行甚至将其重命名以及新创建的迁移文件以适当的名称进行操作可能会很有用。 - Oleksandr Kovpashko

-1

您可以将它们全部删除,然后重新生成迁移。新生成的迁移将包含所有先前的迁移。


7
如果你已经在生产环境下运行,那么这不是一个有效的选项。 - Amaury Liet
新生成的迁移仍将在生产环境中运行,这不应该发生在实时生产环境中。 - Cedomir Rackov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接