【问题标题】:TypeORM - run specific migrationTypeORM - 运行特定的迁移
【发布时间】:2022-01-09 22:46:28
【问题描述】:

我知道typeorm migration:run 可以运行所有迁移文件,但有时我想运行insert 之类的文件或修改后的文件。但我找不到任何文档。怎么做,谢谢。

【问题讨论】:

  • 当你改变一列或插入新行时,你应该生成一个新的迁移文件而不是修改旧版本的迁移,因为迁移代表一个历史,它们是线性的。如果您更改其中一个并运行,您的回滚过程将完全中断,下次其他开发人员将面临错误。
  • 一种解决方法可能是从文件夹中删除所有其他迁移并保留您要运行的迁移。执行后带回已删除的迁移。

标签: typeorm


【解决方案1】:

如果您想用数据播种数据库,则不应使用迁移。 Migrations 的目的是创建数据库的结构,这就是为什么迁移是串行执行的,因此以非串行方式运行单个迁移就没有抓住重点。

对于使用 typeorm 的数据库播种,您可以使用 typeorm cli query,您可以创建一个从文件中读取 SQL 的脚本。

例如在 node.js 应用程序和 bash 中:

package.json:

"scripts": {
...,
"typeorm": "npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli --config ormconfig-migrations.ts",
"db:seed": "bash scripts/db-seed.sh"
}

db-seed.sh:

#!/bin/bash
query=""

for filename in sql/seed/*.seed.sql; do
 query=${query}"$(< ${filename})";
done

npm run typeorm query "${query}";

注意在这个解决方案中有一个bug,记录器typeorm使用总是抛出一个错误——忽略它。与db操作无关,不代表进程成功。

不应修改与他人共享的迁移文件,在这种情况下,请创建新的迁移。 如果该文件未共享且正在开发中,您可以根据需要运行migration:revert,然后修改并再次运行migration:run

【讨论】:

    【解决方案2】:

    这是不可能的。您可以查看迁移文档

    typeorm migration:run -h
    

    在开发过程中,您可以在本地更改连接设置,例如更改 ormconfig.json 中迁移文件的路径以仅匹配您的文件。

    "migrations": [
        "src/db/migration/**/yourmigration.ts"
    ]
    

    【讨论】:

      【解决方案3】:

      为了运行特定的迁移,我的解决方案在ormconfig.js 添加:

      module.exports = {
      ...
         migrations: [process.env.DB_MIGRATION_DIR || 'src/database/migrations/*.ts'],
      ...
      }
      

      现在使用 DB_MIGRATION_DIR=path/to/migration.ts npm run typeorm migration:run 运行您的特定迁移

      另一个强制重新运行迁移的提示,但可能需要对连接字符串变量进行一些自定义 - 添加到您的 package.json:

      {
        "scripts": {
          ...
          "migration:rerun": "psql postgresql://$DB_USER@localhost:5432/$DB_NAME -c "delete from migrations where name like '%$SEED_NAME%';" && DB_MIGRATION_DIR='$DB_MIGRATION_DIR' npm run typeorm migration:run"
          ...
        }
        ...
      }
      

      【讨论】:

        【解决方案4】:

        我认为我们不能使用 cli 运行任何特定的迁移,但我们可以通过查询运行器运行它。请参考以下代码:

         const connection: Connection = getConnection();
        const queryRunner: QueryRunner = connection.createQueryRunner();
        
        //createDatabase16413343434 is class/migration generated from cli
        const createDatabase = new createDatabase16413343434();
         await createDatabase.up(queryRunner);
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
        猜你喜欢
        • 2022-10-26
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 2010-11-21
        • 2015-12-08
        • 2018-12-16
        • 2020-12-14
        • 2020-10-30
        相关资源
        最近更新 更多