Я использую 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")
.