我对几乎所有事情都很陌生。我尝试使用单个迁移文件来创建MySQL数据库中的所有表(20个表)。
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))
};
我希望knex在一个事务中执行所有sql查询
迁移会执行但会生成以下错误:
未处理拒绝错误:事务查询已完成,运行 使用DEBUG = knex:tx获取更多信息
不可否认,我并没有正确掌握如何正确使用promises,而且我理解返回Promise.all块不一定会生成&以相同的顺序执行SQL查询,但我应该这样做吗?为每个表创建单独的迁移文件更有意义吗?
答案 0 :(得分:0)
您正在调用承诺链中的函数而不是链接它们。应该执行第一个函数,然后将其与.then
中的其他函数链接起来。你似乎也混淆了承诺链和Promise.all
的使用。
如果您希望按顺序创建每个表,请删除Promise.all
和函数调用:
return createTable1()
.then(createTable2)
.then(createTable3)
...
.then(createTable20)
.catch((e) => console.log(e.sql))
如果要同时创建N个表,请使用Promise.all
,如下所示:
return Promise.all([createTable1(), createTable2(), ..., createTable20()])