Ich bin neu in so ziemlich allem. Ich habe versucht, eine einzige Migrationsdatei zu verwenden, um alle Tabellen in einer MySQL-Datenbank (20 Tabellen) zu erstellen.Knex MySQL Migration "Unbehandelte Ablehnung Fehler: Transaktionsabfrage bereits abgeschlossen"
exports.up = function(knex, Promise) {
function createTable1() {
return knex.schema.createTableIfNotExists('Table1', (t) => {
t.increments('id').primary();
t.string('col_1', 48).unique().notNullable();
t.timestamps(true, true);
}).catch((e) => console.log(e));
}
function createTable2() {
return knex.schema.createTableIfNotExists('Table2', (t) => {
t.increments('id').primary();
t.string('col_1', 48).unique().notNullable();
t.integer('someId').unsigned().references('Table1.id')
t.timestamps(true, true);
}).catch((e) => console.log(e));
}
function createTable3() {
return knex.schema.createTableIfNotExists('Table3', (t) => {
t.increments('id').primary();
t.string('col_1', 48).unique().notNullable();
t.integer('someId').unsigned().references('Table1.id')
t.integer('someOtherId').unsigned().references('Table2.id')
t.timestamps(true, true);
}).catch((e) => console.log(e));
}
... //similar functions for all 20 tables
return Promise.all([
createTable1()
.then(createTable2())
.then(createTable3())
...
.then(createTable20())
.catch((e) => console.log(e.sql))
]);
}
exports.down = function(knex, Promise) {
return knex.schema.dropTable('Table1')
.then(knex.schema.dropTable('Table2'))
.then(knex.schema.dropTable('Table3'))
...
.then(knex.schema.dropTable('Table20'))
.catch((e) => console.log(e.sql))
};
Ich erwartete Knex alle SQL-Abfragen in einer Transaktion
Die Migration führt auszuführen, sondern erzeugt den folgenden Fehler:
Unhandled rejection Error: Transaction query already complete, run with DEBUG=knex:tx for more info
Zwar habe ich nicht ein fester Griff mit, wie man Versprechungen richtig benutzt, und ich verstehe, dass die Rückkehr Promise.all Block nicht notwendigerweise & Execut erzeugen wird e die SQL-Abfragen in der gleichen Reihenfolge, aber sollte ich das auch tun? Ist es sinnvoller, für jede Tabelle eine eigene Migrationsdatei zu erstellen?
> Ist es sinnvoller, für jede Tabelle eine separate Migrationsdatei zu erstellen? ich denke, es ist häufiger, das zu tun – langitbiru