Knex: 在尝试使用knex迁移添加外键之前创建表的正确方法?

创建于 2015-08-16  ·  3评论  ·  资料来源: knex/knex

我有一个表table1,其中有对table2和table3的引用。 确保在创建外键之前创建table2和table3的正确方法是什么? 当前,我为每个表都有一个迁移文件,但是我假设我必须链接表的创建。

谢谢

migrations question

最有用的评论

没错

// migration: <timestamp>_create_things.js

module.exports.up = function(knex, Promise) {
  // Create referenced table before referencing table.
  return knex.schema
  .createTable('first', function(first) {
    first.increments('id').primary();
  })
  .createTable('second', function(second) {
    second.increments('id').primary();
    second.integer('first_id').references('id').inTable('first').notNull().onDelete('cascade');
  });
};

module.exports.down = function(knex, Promise) {
  // Reverse order here to prevent error.
  return knex.schema
  .dropTable('second')
  .dropTable('first');
}

所有3条评论

没错

// migration: <timestamp>_create_things.js

module.exports.up = function(knex, Promise) {
  // Create referenced table before referencing table.
  return knex.schema
  .createTable('first', function(first) {
    first.increments('id').primary();
  })
  .createTable('second', function(second) {
    second.increments('id').primary();
    second.integer('first_id').references('id').inTable('first').notNull().onDelete('cascade');
  });
};

module.exports.down = function(knex, Promise) {
  // Reverse order here to prevent error.
  return knex.schema
  .dropTable('second')
  .dropTable('first');
}

有没有办法确保迁移文件按特定顺序运行? 例如,在一个文件中创建所有“常规”表,然后又用另一个迁移文件来创建我可能需要的任何联结表,是一种不好的做法吗?

还是应该全部在同一文件中完成?

@LostCross认为迁移文件是对整个架构的修改,而不是对单个表的修改。

例如,第一个迁移文件必须设置整个节目。

如果在应用程序生命周期中存在一项新功能,并且随着数据库中的某些更改,则应创建一个新的迁移文件。

如果您这样做,那么与将表拆分为多个文件相比,问题将少很多。

每个文件都有一个事务,因此,如果要同步文件执行,则需要弄乱连接池,以便将序列视为理所当然。 我不是没有可能,但是付出的努力没有回报。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

npow picture npow  ·  3评论

ghost picture ghost  ·  3评论

nklhrstv picture nklhrstv  ·  3评论

aj0strow picture aj0strow  ·  3评论

mishitpatel picture mishitpatel  ·  3评论