【问题标题】:Error while creating foreign relation in knex - table creation race condition在 knex 中创建外部关系时出错 - 表创建竞争条件
【发布时间】:2021-11-10 23:59:07
【问题描述】:

我是 knex 的新手,多年来没有接触过 RDBMS(一直在 NoSQL 领域),所以请耐心等待。

我有两个迁移文件,一个用于轨道,一个用于用户(轨道归用户所有)。以下是相关文件:

迁移/20190919103115_users.js

exports.up = function(knex) {
  return knex.schema.createTable('users', table => {
    table.increments('id');
    table.string('email', 50);
    table.string('first_name', 50);
    table.string('last_name', 50);
  }  
};

exports.down = function(knex) {
  return knex.schema.dropTable('users');
};

迁移/20190406112728_tracks.js

exports.up = function(knex) {
  return knex.schema.createTable('tracks', table => {
    table.increments('id');
    table.string('name', 140).notNullable();
    table.integer('owner_id').notNullable();
    table
      .foreign('owner_id')
      .references('id')
      .inTable('users')
      .onDelete('CASCADE');
    table.json('metadata');
  });
};

exports.down = function(knex) {
  return knex.schema.dropTable('tracks');
};

当我运行yarn knex migrate:up 时,我得到:

migration file "20190406112728_tracks.js" failed
migration failed with error: alter table "tracks" add constraint "tracks_owner_id_foreign" foreign key ("owner_id") references "users" ("id") on delete CASCADE - relation "users" does not exist

我发现官方的 Knex 文档非常缺乏(它更像是一个参考而不是其他任何东西)并且无法弄清楚我缺少什么。显然我需要一些方法来在tracks 之前创建users,但不知道如何。

编辑:

看起来是这样的:https://github.com/tgriesser/knex/issues/938#issuecomment-131491877

但是将整个表集放在一个迁移文件中似乎是错误的。我认为重点是为每个表创建一个迁移文件?

【问题讨论】:

  • 对我来说,拥有一个函数似乎是完全合理的,这样您就可以控制创建/删除的顺序来解释外键。这就是我在 SQL 脚本中的做法。您链接的文章中的所有用户似乎都同意。
  • @JacobH 是的。似乎单独的迁移文件是为了以后添加到架构中以添加到列/等上。

标签: sql postgresql knex.js


【解决方案1】:

迁移文件在执行前按名称排序,因此看起来您的tracks 文件名的日期较早,因此它在创建用户之前运行。

只需运行npx knex migrate:make create_users,然后运行npx knex migrate:make create_tracks

它将生成具有正确时间戳的新文件,将您的代码复制到新文件中,删除旧文件:]

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2015-06-10
    • 2010-12-07
    • 1970-01-01
    • 2010-09-29
    • 2014-05-25
    • 2019-02-15
    • 1970-01-01
    相关资源
    最近更新 更多