【问题标题】:Foreign Key definitions on Sequelize ModelsSequelize 模型上的外键定义
【发布时间】:2016-03-30 08:52:00
【问题描述】:

我正在尝试在 Postgresql 上创建这两个表的 Sequelize (3.20) 模型:

| user  |          | comment  |
|-------|          |----------|
| id    |          | id       |
| email |          | userId   |

user 表在 crm 架构上,comment 表在 comment 架构上。 comment.userId 具有 user.id 的外键。

var User = db_conn.define('user', {
  email: {
    ...
  }
}, {
  ...
});
User.sync({force: true}).then(function () {
  return User.create({
    email: 'mail@gmail.com'
  });
});

var Comment = db_conn.define('comment', {
  userId: {
    type: Sequelize.INTEGER,
    allowNull: false,
    references: {
        model: User,
        key  : 'id',
        deferrable: Sequelize.Deferrable.INITIALLY_DEFERRED
    }
  }
}, {
  ...
});
Comment.sync({force: true}).then(function () {
  return Comment.create({
    userId: 1,
  });
});

但是我收到了这个错误:

Unhandled rejection SequelizeDatabaseError: relation "user" does not exist

生成的 SQL:

CREATE TABLE IF NOT EXISTS "comment"."comment" ("id"   SERIAL, "userID" INTEGER NOT NULL REFERENCES "user" ("id") DEFERRABLE INITIALLY DEFERRED);

如您所见,它正在为 user 表而不是 'crm'.'user' 表创建 FK。这是因为公共模式上没有 user 表而导致错误。你能告诉我我错过了什么吗?

谢谢。

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    在 Sequelize 修复此问题之前,您可以设置用于登录数据库的用户的 search_path,如下所示:

    ALTER ROLE sequelize_user IN DATABASE my_sequelize_app_db
      SET search_path = crm, comment, public;
    

    这样,当前失败的 CREATE TABLE 语句将很好地工作。只有在不同架构上具有相同名称的表时才会遇到问题。

    【讨论】:

      【解决方案2】:

      使用以下代码尝试:

      var Comment = db_conn.define('comment', {
        userId: {
          type: Sequelize.INTEGER,
          allowNull: false,
          references: 'user',
          referencesKey: 'userId'
          }
        }
      }
      

      'references'-属性的名称必须与数据库中的表名完全相同(注意大写!)

      这能解决您的问题吗?

      【讨论】:

      • 同样的错误@Simon。也得到 deprecated 错误
      【解决方案3】:

      Sequelize 目前不支持跨数据库连接。这里的人提出了一个黑客来实现它。请检查。

      https://github.com/sequelize/sequelize/issues/3023

      【讨论】:

      • 不是跨数据库的。所有这些模式都在同一个数据库上。
      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2020-02-16
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多