2017-12-12 9 views
0

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?

+0

> Ist es sinnvoller, für jede Tabelle eine separate Migrationsdatei zu erstellen? ich denke, es ist häufiger, das zu tun – langitbiru

Antwort

0

Sie rufen Funktionen in Ihrer Versprechenskette auf, anstatt sie zu verketten. Die erste Funktion sollte ausgeführt und dann mit anderen Funktionen in der .then verkettet werden. Sie scheinen auch die Verkettung und die Verwendung von Promise.all zu vermischen.

Wenn Sie jede Tabelle die Promise.all erstellt nacheinander fallen werden, und die Funktion aufruft:

return Promise.all([createTable1(), createTable2(), ..., createTable20()]) 
:

return createTable1() 
    .then(createTable2) 
    .then(createTable3) 
    ... 
    .then(createTable20) 
    .catch((e) => console.log(e.sql)) 

Wenn Sie N Tabellen alle zur gleichen Zeit verwenden Promise.all wie diese erstellen möchten

Verwandte Themen