Knex MySQL Migration"未处理的拒绝错误:交易查询已经完成"

时间:2017-12-12 00:07:36

标签: javascript mysql node.js innodb knex.js

我对几乎所有事情都很陌生。我尝试使用单个迁移文件来创建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查询,但我应该这样做吗?为每个表创建单独的迁移文件更有意义吗?

1 个答案:

答案 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()])