mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-12 05:17:28 -08:00
fix: Run every DB migration inside a transaction (#5129)
* always each DB migrations in a transaction * `VACUUM` isn't allowed inside transactions. * `PRAGMA foreign_keys` are automatically toggled before and after every down migration
This commit is contained in:
parent
a573db2ef7
commit
62cce2e518
|
@ -132,6 +132,7 @@ export async function init(
|
|||
synchronize: false,
|
||||
logging: loggingOption,
|
||||
maxQueryExecutionTime,
|
||||
migrationsTransactionMode: 'each',
|
||||
});
|
||||
|
||||
connection = await createConnection(connectionOptions);
|
||||
|
@ -151,9 +152,7 @@ export async function init(
|
|||
|
||||
// If you remove this call, remember to turn back on the
|
||||
// setting to run migrations automatically above.
|
||||
await connection.runMigrations({
|
||||
transaction: 'none',
|
||||
});
|
||||
await connection.runMigrations();
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||||
if (migrations.length === 0) {
|
||||
|
|
|
@ -28,7 +28,6 @@ export class AddWaitColumn1621707690587 implements MigrationInterface {
|
|||
await queryRunner.query(
|
||||
`CREATE INDEX "IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2" ON "${tablePrefix}execution_entity" ("waitTill")`,
|
||||
);
|
||||
await queryRunner.query(`VACUUM;`);
|
||||
|
||||
logMigrationEnd(this.name);
|
||||
}
|
||||
|
@ -50,6 +49,5 @@ export class AddWaitColumn1621707690587 implements MigrationInterface {
|
|||
await queryRunner.query(
|
||||
`CREATE INDEX "IDX_${tablePrefix}cefb067df2402f6aed0638a6c1" ON "${tablePrefix}execution_entity" ("stoppedAt")`,
|
||||
);
|
||||
await queryRunner.query(`VACUUM;`);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,8 +33,6 @@ export class AddUserSettings1652367743993 implements MigrationInterface {
|
|||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
const tablePrefix = config.getEnv('database.tablePrefix');
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=OFF');
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" RENAME TO "temporary_user"`);
|
||||
await queryRunner.query(
|
||||
`CREATE TABLE "${tablePrefix}user" ("id" varchar PRIMARY KEY NOT NULL, "email" varchar(255), "firstName" varchar(32), "lastName" varchar(32), "password" varchar, "resetPasswordToken" varchar, "resetPasswordTokenExpiration" integer DEFAULT NULL, "personalizationAnswers" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "globalRoleId" integer NOT NULL, CONSTRAINT "FK_${tablePrefix}f0609be844f9200ff4365b1bb3d" FOREIGN KEY ("globalRoleId") REFERENCES "${tablePrefix}role" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`,
|
||||
|
@ -46,7 +44,5 @@ export class AddUserSettings1652367743993 implements MigrationInterface {
|
|||
await queryRunner.query(
|
||||
`CREATE UNIQUE INDEX "UQ_${tablePrefix}e12875dfb3b1d92d7d7c5377e2" ON "${tablePrefix}user" ("email")`,
|
||||
);
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=ON');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,8 +35,6 @@ export class AddAPIKeyColumn1652905585850 implements MigrationInterface {
|
|||
async down(queryRunner: QueryRunner): Promise<void> {
|
||||
const tablePrefix = config.getEnv('database.tablePrefix');
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=OFF');
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" RENAME TO "temporary_user"`);
|
||||
await queryRunner.query(
|
||||
`CREATE TABLE "${tablePrefix}user" ("id" varchar PRIMARY KEY NOT NULL, "email" varchar(255), "firstName" varchar(32), "lastName" varchar(32), "password" varchar, "resetPasswordToken" varchar, "resetPasswordTokenExpiration" integer DEFAULT NULL, "personalizationAnswers" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "globalRoleId" integer NOT NULL, "settings" text, CONSTRAINT "FK_${tablePrefix}f0609be844f9200ff4365b1bb3d" FOREIGN KEY ("globalRoleId") REFERENCES "${tablePrefix}role" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION)`,
|
||||
|
@ -48,7 +46,5 @@ export class AddAPIKeyColumn1652905585850 implements MigrationInterface {
|
|||
await queryRunner.query(
|
||||
`CREATE UNIQUE INDEX "UQ_${tablePrefix}e12875dfb3b1d92d7d7c5377e2" ON "${tablePrefix}user" ("email")`,
|
||||
);
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=ON');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,6 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte
|
|||
await queryRunner.query(
|
||||
`CREATE INDEX "IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2" ON "${tablePrefix}execution_entity" ("waitTill")`,
|
||||
);
|
||||
await queryRunner.query(`VACUUM;`);
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=ON');
|
||||
|
||||
|
@ -66,7 +65,6 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte
|
|||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
const tablePrefix = config.getEnv('database.tablePrefix');
|
||||
await queryRunner.query('PRAGMA foreign_keys=OFF');
|
||||
|
||||
await queryRunner.query(`DROP TABLE IF EXISTS "${tablePrefix}temporary_execution_entity"`);
|
||||
await queryRunner.query(
|
||||
|
@ -100,8 +98,5 @@ export class DeleteExecutionsWithWorkflows1673268682475 implements MigrationInte
|
|||
await queryRunner.query(
|
||||
`CREATE INDEX "IDX_${tablePrefix}ca4a71b47f28ac6ea88293a8e2" ON "${tablePrefix}execution_entity" ("waitTill")`,
|
||||
);
|
||||
await queryRunner.query(`VACUUM;`);
|
||||
|
||||
await queryRunner.query('PRAGMA foreign_keys=ON');
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue