javascript - 如何进行 knex.js 迁移?

标签 javascript knex.js

我仍然不确定如何使用 knex 进行迁移。这是我到目前为止所拥有的。它适用于 up,但是 down 即使foreign_key_checks = 0,也会给我带来 FK 约束错误。

exports.up = function(knex, Promise) {
  return Promise.all([
    knex.raw('SET foreign_key_checks = 0;'),

    /* CREATE Member table */
    knex.schema.createTable('Member', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.string('email',50);
      table.string('password');

      /* CREATE FKS */
      table.bigInteger('ReferralId').unsigned().index();
      table.bigInteger('AddressId').unsigned().index().inTable('Address').references('id');
    }),

    /* CREATE Address table */
    knex.schema.createTable('Address', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.index(['city','state','zip']);

      table.string('city',50).notNullable();
      table.string('state',2).notNullable();
      table.integer('zip',5).unsigned().notNullable();
    }),

    knex.raw('SET foreign_key_checks = 1;')
  ]);
};

exports.down = function(knex, Promise) {
  return Promise.all([
    knex.raw('SET foreign_key_checks = 0;'),

    knex.schema.dropTable('Address'),

    knex.schema.dropTable('Member'),

    knex.raw('SET foreign_key_checks = 1;')

  ]);
};

最佳答案

jedd.ahyoung 是正确的。您不需要将连接池限制为 1。您只需链接您的 Promise,这样它们就不会并行运行。

例如:

exports.up = function(knex, Promise) {
  return removeForeignKeyChecks()
    .then(createMemberTable)
    .then(createAddressTable)
    .then(addForeignKeyChecks);

  function removeForeignKeyChecks() {
    return knex.raw('SET foreign_key_checks = 0;');
  }

  function addForeignKeyChecks() {
    return knex.raw('SET foreign_key_checks = 1;');
  }

  function createMemberTable() {
    return knex.schema.createTable('Member', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.string('email',50);
      table.string('password');

      /* CREATE FKS */
      table.bigInteger('ReferralId').unsigned().index();
      table.bigInteger('AddressId').unsigned().index().inTable('Address').references('id');
    });
  }

  function createAddressTable() {
    return knex.schema.createTable('Address', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.index(['city','state','zip']);

      table.string('city',50).notNullable();
      table.string('state',2).notNullable();
      table.integer('zip',5).unsigned().notNullable();
    });
  }
};

此外,我可能遗漏了一些内容,但如果您在成员表之前创建地址表,那么您似乎不需要删除然后恢复外键检查。

最终代码如下所示:

exports.up = function(knex, Promise) {
  return createAddressTable()
    .then(createMemberTable);

  function createMemberTable() {
    return knex.schema.createTable('Member', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.string('email',50);
      table.string('password');

      /* CREATE FKS */
      table.bigInteger('ReferralId').unsigned().index();
      table.bigInteger('AddressId').unsigned().index().inTable('Address').references('id');
    });
  }

  function createAddressTable() {
    return knex.schema.createTable('Address', function (table) {
      table.bigIncrements('id').primary().unsigned();
      table.index(['city','state','zip']);

      table.string('city',50).notNullable();
      table.string('state',2).notNullable();
      table.integer('zip',5).unsigned().notNullable();
    });
  }
};

关于javascript - 如何进行 knex.js 迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22624879/

相关文章:

node.js - 将 knex SELECT 查询结果用于另一个 SELECT 查询

javascript - jQuery 将代码合并到一个函数中

javascript - 使用 knex.js 从关联表中删除数据

javascript - TypeScript - 如何继承类和覆盖 lambda 方法

javascript - 如何在 JavaScript 中解析这个 JSON 对象?

postgresql - 当另一列为 null 或不为 null 时,如何添加约束,例如一列具有特定值?

mysql - SQL 迁移。保留旧 ID 无效

postgresql - Knex.js:横向连接

javascript - typescript 和 AngularJS 1.5 : How to handle export class

Javascript/Jquery - 如何获取用户用光标选择的元素?