Можно ли использовать оператор PRite "PRAGMA foreign_keys = OFF" внутри миграции TypeORM? - PullRequest
1 голос
/ 19 марта 2020

Я использую TypeORM (v0.2.18) с Node.js (v12.7.0) для выполнения миграций в моей базе данных SQLite.

Это моя ситуация: у меня есть таблица с именем country и стол с именем workflow. Я хочу удалить один из столбцов с именем name из country, но через этот столбец workflow ссылается country.

Игра в браузере БД для SQLite Я мог бы успешно удалить столбец с помощью этих операторы:

PRAGMA foreign_keys=OFF;
CREATE TEMPORARY TABLE country_backup(id, createdAt, updatedAt, enabled, codeIso2);
INSERT INTO country_backup SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country;
DROP TABLE country;
CREATE TABLE country(id, createdAt, updatedAt, enabled, codeIso2);
INSERT INTO country SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country_backup;
DROP TABLE country_backup;
PRAGMA foreign_keys=ON;

которые я использовал при миграции TypeORM следующим образом:

...
public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query("PRAGMA foreign_keys=OFF");
    await queryRunner.query("CREATE TEMPORARY TABLE country_backup(id, createdAt, updatedAt, enabled, codeIso2)");
    await queryRunner.query("INSERT INTO country_backup SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country");
    await queryRunner.query("DROP TABLE country");
    await queryRunner.query("CREATE TABLE country(id, createdAt, updatedAt, enabled, codeIso2)");
    await queryRunner.query("INSERT INTO country SELECT id, createdAt, updatedAt, enabled, codeIso2 FROM country_backup");
    await queryRunner.query("DROP TABLE country_backup");
    await queryRunner.query("PRAGMA foreign_keys=ON");
}
...

Но я получаю эту ошибку:

Error during migration run:
QueryFailedError: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
    at new QueryFailedError (/.../api/src/error/QueryFailedError.ts:9:9)
    at Statement.handler (/.../src/driver/sqlite/SqliteQueryRunner.ts:53:26)
    at Statement.replacement (/.../api/node_modules/sqlite3/lib/trace.js:19:31)
    at Statement.replacement (/.../api/node_modules/sqlite3/lib/trace.js:19:31) {
  message: 'SQLITE_CONSTRAINT: FOREIGN KEY constraint failed',
  errno: 19,
  code: 'SQLITE_CONSTRAINT',
  name: 'QueryFailedError',
  query: 'DROP TABLE country',
  parameters: []
}

Почему это работает Браузер БД для SQLite, но не с TypeORM? Это похоже на игнорирование оператора PRAGMA.

Основываясь на this , я попытался с PRAGMA foreign_keys и PRAGMA legacy_alter_table (установив их в положение OFF и ON (перед любым действием) и ON и OFF (после любого действия), соответственно).

Я пытался использовать PRAGMA как внутри функции up(), так и вне ее. Снаружи это означает, что я поместил утверждения до и после await typeOrmConnection.runMigrations() в моем файле main.ts, например await typeOrmConnection.query("PRAGMA foreign_keys=OFF").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...