Sequelize 迁移中的关联
Associations in Sequelize migrations
我的应用目前使用 Sequelize sync()
方法创建数据库,我想将其更改为使用迁移系统。
我的一个模型与其他模型有 belongsTo()
关联,我真的不知道如何为这些关联制作初始迁移代码。
我是否必须使用 SQL 查询手动创建外键,或者是否有一些可用的方法?
案例一:数据库初始化
如果您的目的是在数据库结构初始化期间添加关系,最好只使用 sync
方法而不是使用迁移手动添加它们。如果您的模型设计正确并定义了关系,它们将在执行 sync
方法期间自动创建。
看看sequelize express example。在模型目录中,您有三个文件:
index.js
- 包括所有型号
task.js
- 任务模型
user.js
- 用户模型
查看task.js
内容,从第7行开始,以下代码创建了用户和任务模型之间的关系:
classMethods: {
associate: function(models) {
Task.belongsTo(models.User, {
onDelete: "CASCADE",
foreignKey: {
allowNull: false
}
});
}
}
如果您在模型文件中正确准备了关系,sync 将为您创建外键。在这种情况下不需要迁移。
我鼓励您阅读整个 express-example readme.md
并浏览存储库文件以了解它们如何与 express 和 sequelize 一起工作。
案例二:数据库结构迁移
如果您已经有一些想要保留的数据,则需要使用迁移脚本,因为同步重组数据库的唯一方法是将其连同所有数据一起完全销毁。
您可以阅读基本内容 migrations in the sequelize docs。不幸的是,文档不包括创建关系。假设您要创建以下关系:用户属于组。要在关系的用户端创建列,您可以使用 addColumn
方法。
queryInterface.addColumn(
'user',
'group_id',
{
type: Sequelize.INTEGER,
allowNull: true
}
)
不幸的是,目前还没有一个很好的函数来为您创建外键约束,但您可以使用 sequelize 查询方法手动完成。 PostgreSQL 示例:
queryInterface.sequelize.query("ALTER TABLE user
ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
REFERENCES group (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;");
编辑:添加数据库结构迁移案例
经过大量搜索,我找到了几篇解释我想做什么的博客文章。第一个已经不存在了,here's the second one
显然这不是真正的常用方法,但对我来说似乎更合乎逻辑。如果您只想使用迁移,则必须使用 SQL 查询来创建初始迁移。
但无论如何,我认为 ezpn 关于使用同步创建初始数据库然后迁移的做法是正确的。这似乎比使用 umzug 更简单,只使用迁移。
您可以添加对迁移的引用
示例:
user_id: {
type: Sequelize.BIGINT,
references: {
model: "users",
key: "id"
}
},
只需确保您引用的模型存在。
将此添加为对上述@aryeh-armon 回答的回答而不是评论(代表不足)。这是您需要确保存在的 table 名称,而不是模型名称。即,如果您的模型名为 Job,而您的数据库 table 名为 Jobs,那么迁移将如下所示。
jobId: {
type: Sequelize.INTEGER,
references: {
model: "Jobs",
key: "id"
}
},
我的应用目前使用 Sequelize sync()
方法创建数据库,我想将其更改为使用迁移系统。
我的一个模型与其他模型有 belongsTo()
关联,我真的不知道如何为这些关联制作初始迁移代码。
我是否必须使用 SQL 查询手动创建外键,或者是否有一些可用的方法?
案例一:数据库初始化
如果您的目的是在数据库结构初始化期间添加关系,最好只使用 sync
方法而不是使用迁移手动添加它们。如果您的模型设计正确并定义了关系,它们将在执行 sync
方法期间自动创建。
看看sequelize express example。在模型目录中,您有三个文件:
index.js
- 包括所有型号task.js
- 任务模型user.js
- 用户模型
查看task.js
内容,从第7行开始,以下代码创建了用户和任务模型之间的关系:
classMethods: {
associate: function(models) {
Task.belongsTo(models.User, {
onDelete: "CASCADE",
foreignKey: {
allowNull: false
}
});
}
}
如果您在模型文件中正确准备了关系,sync 将为您创建外键。在这种情况下不需要迁移。
我鼓励您阅读整个 express-example readme.md
并浏览存储库文件以了解它们如何与 express 和 sequelize 一起工作。
案例二:数据库结构迁移
如果您已经有一些想要保留的数据,则需要使用迁移脚本,因为同步重组数据库的唯一方法是将其连同所有数据一起完全销毁。
您可以阅读基本内容 migrations in the sequelize docs。不幸的是,文档不包括创建关系。假设您要创建以下关系:用户属于组。要在关系的用户端创建列,您可以使用 addColumn
方法。
queryInterface.addColumn(
'user',
'group_id',
{
type: Sequelize.INTEGER,
allowNull: true
}
)
不幸的是,目前还没有一个很好的函数来为您创建外键约束,但您可以使用 sequelize 查询方法手动完成。 PostgreSQL 示例:
queryInterface.sequelize.query("ALTER TABLE user
ADD CONSTRAINT user_group_id_fkey FOREIGN KEY (group_id)
REFERENCES group (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;");
编辑:添加数据库结构迁移案例
经过大量搜索,我找到了几篇解释我想做什么的博客文章。第一个已经不存在了,here's the second one
显然这不是真正的常用方法,但对我来说似乎更合乎逻辑。如果您只想使用迁移,则必须使用 SQL 查询来创建初始迁移。
但无论如何,我认为 ezpn 关于使用同步创建初始数据库然后迁移的做法是正确的。这似乎比使用 umzug 更简单,只使用迁移。
您可以添加对迁移的引用
示例:
user_id: {
type: Sequelize.BIGINT,
references: {
model: "users",
key: "id"
}
},
只需确保您引用的模型存在。
将此添加为对上述@aryeh-armon 回答的回答而不是评论(代表不足)。这是您需要确保存在的 table 名称,而不是模型名称。即,如果您的模型名为 Job,而您的数据库 table 名为 Jobs,那么迁移将如下所示。
jobId: {
type: Sequelize.INTEGER,
references: {
model: "Jobs",
key: "id"
}
},