С миграциями TypeORM, как заполнить столбец во время миграции - PullRequest
0 голосов
/ 19 октября 2018

Рассмотрим следующее, где между двумя командами queryRunner.query я хочу сделать некоторую логику для заполнения нового столбца.

  public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(`ALTER TABLE "users" ADD "selectedNotebookId" uuid`);

    const userRepo = await queryRunner.connection.getRepository(User);

    const allUsers = await userRepo.find({
      where: {},
      relations: ['notebooks']
    });

    const bar = new ProgressBar(':bar', { total: allUsers.length });

    const promises: Promise<void>[] = allUsers.map((user: User) => {
      user.selectedNotebook = user.notebooks[0];
      return userRepo.save(user).then(() => {
        bar.tick();
      });
    });

    await Promise.all(promises);

    await queryRunner.query(
      `ALTER TABLE "users" ADD CONSTRAINT "UQ_df4319c3d54b91856514f0dbcb3" UNIQUE ("selectedNotebookId")`
    );
    await queryRunner.query(
      `ALTER TABLE "users" ADD CONSTRAINT "FK_df4319c3d54b91856514f0dbcb3" FOREIGN KEY ("selectedNotebookId") REFERENCES "notebook"("id")`
    );
  }

Проблема, с которой я сталкиваюсь, заключается в том, что первая ALTER TABLEКоманда блокирует последующий запрос.

Моя проблема в том, что оба оператора обернуты в транзакцию, которую предоставляет среда миграции

Каков наилучший способ обойти это.

Спасибо !!

1 Ответ

0 голосов
/ 19 октября 2018

Разберитесь:

  public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(`START TRANSACTION`);
    await queryRunner.query(`ALTER TABLE "users" ADD "selectedNotebookId" uuid`);
    await queryRunner.query(`COMMIT TRANSACTION`);

    const userRepo = await queryRunner.connection.getRepository(User);

    const allUsers = await userRepo.find({
      where: {},
      relations: ['notebooks']
    });

    const bar = new ProgressBar(':bar', { total: allUsers.length });

    const promises: Promise<void>[] = allUsers.map((user: User) => {
      user.selectedNotebook = user.notebooks[0];
      return userRepo.save(user).then(() => {
        bar.tick();
      });
    });

    await Promise.all(promises);

    await queryRunner.query(
      `ALTER TABLE "users" ADD CONSTRAINT "UQ_df4319c3d54b91856514f0dbcb3" UNIQUE ("selectedNotebookId")`
    );
    await queryRunner.query(
      `ALTER TABLE "users" ADD CONSTRAINT "FK_df4319c3d54b91856514f0dbcb3" FOREIGN KEY ("selectedNotebookId") REFERENCES "notebook"("id")`
    );
  }

обратите внимание на await queryRunner.query( START TRANSACTION );, который включает команду ALTER TABLE

, которая создает для нас субтранзакцию.ПРИМЕЧАНИЕ - это может работать только для postgreSQL

...