【问题标题】:How to create an SQL-server catalog using TypeORM in migration?如何在迁移中使用 TypeORM 创建 SQL 服务器目录?
【发布时间】:2022-09-23 19:35:37
【问题描述】:

我正在尝试在以下环境中设置全文搜索:Node.js、Nest.js、TypeORM 和 Microsoft SQL 数据库。

我尝试运行的迁移:

import { MigrationInterface, QueryRunner } from \'typeorm\';

export default class addFullTextIndexToAttachmentComments1663750544577 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`--sql
      CREATE FULLTEXT CATALOG AttachmentComment
    `);
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`--sql
      DROP FULLTEXT CATALOG AttachmentComment
    `);
  }
}

我得到的错误:

QueryFailedError: Error: CREATE FULLTEXT CATALOG statement cannot be used inside a user transaction.

如我所见,typeorm queryrunner 运行一个事务,但不允许在事务内部创建目录。 有没有办法在 typeorm queryrunner 中抑制事务,或者可能有另一种解决方案?

    标签: node.js sql-server database-migration typeorm


    【解决方案1】:

    看来我终于找到了解决方案。

    它由三个简单的步骤组成:

    1. ormconfig.ts (js) 中添加以下选项:
          migrationsTransactionMode: 'each'
      

      默认情况下,它是“全部”。 “无”也可用。一般来说,使用“无”它已经可以工作,但我不想关闭所有事务。我不确定是否真的需要用“每个”替换默认的“全部”,但似乎它是有道理的。

      1. 在事务中,在函数“up”和“down”内使用 queryRunner 的内置方法提交事务。 运行在用户事务中不可能运行的查询。
      2. 开始一个新事务。如果最终没有开始新的事务,就会出现另一个错误。
      public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.commitTransaction();
      
        await queryRunner.query(`--sql
          // your query
        `);
      
        await queryRunner.startTransaction();
      }
      

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2022-07-25
      • 1970-01-01
      • 2021-04-29
      • 2022-09-24
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      相关资源
      最近更新 更多