Sequelize模型的外键定义

时间:2016-03-25 20:23:58

标签: node.js postgresql sequelize.js

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

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

用户表位于 crm 架构上,注释表位于注释架构上。 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);

如您所见,它创建了一个FK到user表而不是'crm'.'user'表。由于公共架构上没有 user 表,因此它出现了错误。你能告诉我我错过了什么吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

作为解决方法,直到Sequelize修复了此问题,您可以使用以下命令设置要登录数据库的用户的search_path:

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

这样,当前失败的CREATE TABLE语句将很好地工作。如果在不同的模式上具有相同名称的表,则只会遇到问题。

答案 1 :(得分:0)

使用此代码尝试:

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

重要的是,引用' -attribute与数据库中的表名完全相同(请注意大小写!)

这会解决您的问题吗?

答案 2 :(得分:-1)

Sequelize目前还不支持跨数据库连接。这里的人建议实现它。请检查。

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