Sequelize 模型的外键定义
Foreign Key definitions on Sequelize Models
我正在尝试在 Postgresql 上创建这两个 table 的 Sequelize (3.20) 模型:
| user | | comment |
|-------| |----------|
| id | | id |
| email | | userId |
user table 在 crm 模式和 comment table 在 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
table 而不是 'crm'.'user'
table 创建 FK。这是一个错误,因为在 public 架构上没有 user table。你能告诉我我缺少什么吗?
谢谢。
使用此代码试试:
var Comment = db_conn.define('comment', {
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: 'user',
referencesKey: 'userId'
}
}
}
重要的是,'references'-属性与数据库中的 table-名称具有完全相同的名称(注意大小写!)
这是否解决了您的问题?
Sequelize 目前不支持跨数据库连接。这里的人提出了一个黑客来实现它。请检查。
在 Sequelize 解决此问题之前,您可以设置 search_path 用于登录数据库的用户,如下所示:
ALTER ROLE sequelize_user IN DATABASE my_sequelize_app_db
SET search_path = crm, comment, public;
这样,当前失败的 CREATE TABLE 语句将正常工作。如果您在不同模式上具有相同名称的表,您只会 运行 遇到问题。
我正在尝试在 Postgresql 上创建这两个 table 的 Sequelize (3.20) 模型:
| user | | comment |
|-------| |----------|
| id | | id |
| email | | userId |
user table 在 crm 模式和 comment table 在 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
table 而不是 'crm'.'user'
table 创建 FK。这是一个错误,因为在 public 架构上没有 user table。你能告诉我我缺少什么吗?
谢谢。
使用此代码试试:
var Comment = db_conn.define('comment', {
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: 'user',
referencesKey: 'userId'
}
}
}
重要的是,'references'-属性与数据库中的 table-名称具有完全相同的名称(注意大小写!)
这是否解决了您的问题?
Sequelize 目前不支持跨数据库连接。这里的人提出了一个黑客来实现它。请检查。
在 Sequelize 解决此问题之前,您可以设置 search_path 用于登录数据库的用户,如下所示:
ALTER ROLE sequelize_user IN DATABASE my_sequelize_app_db
SET search_path = crm, comment, public;
这样,当前失败的 CREATE TABLE 语句将正常工作。如果您在不同模式上具有相同名称的表,您只会 运行 遇到问题。