在最近的项目中,我一直在使用sequelize,并且我对关联与迁移背后的情况感到好奇。例如,当我生成2个模型时:
user = {
id,
name,
}
和
post = {
id,
name,
}
然后生成一个迁移以添加关联的列:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
'posts',
'userId', // name of the key we're adding
{
type: Sequelize.UUID,
references: {
model: 'users', // name of Target model
key: 'id', // key in Target model that we're referencing
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL',
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn(
'posts', // name of Source model
'userId' // key we want to remove
);
}
};
如果上述迁移将实际的associate
列添加到posts表中,则模型中的userId
方法会做什么?
模型中associate
方法的示例:
module.exports = (sequelize, DataTypes) => {
const post = sequelize.define('post', {
name: DataTypes.TEXT
}, {});
post.associate = function(models) {
post.belongsTo(models.user);
};
return post;
};
如果关联方法最终在db中创建实际的外键列,则提出了一个更大的问题,这是创建外键列所必需的中间迁移(如上图所示,它创建了外键列) ?
答案 0 :(得分:0)
尽管这不能完全详细回答这个问题,there's a decent description关于在关联文件夹下的续集github存储库中的关联
评论指出:
创建关联会将外键约束添加到属性
此外,以下内容暗示了实际上是从关联中生成列的事实:
* To get full control over the foreign key column added by sequelize,
* you can use the `foreignKey` option. It can either be a string,
* that specifies the name, or and object type definition,
* equivalent to those passed to `sequelize.define`.
*
* ```js
* User.hasMany(Picture, { foreignKey: 'uid' })
* ```
*
* The foreign key column in Picture will now be called `uid`
* instead of the default `userId`.
*
* ```js
* User.hasMany(Picture, {
* foreignKey: {
* name: 'uid',
* allowNull: false
* }
* })
* ```
答案 1 :(得分:0)
TL; DR:续集
Associations
在数据库方面不做任何事情,这意味着它们不能(创建表,添加列,添加约束,.. etc等)>免责声明::我可能没有涵盖所有的好处/区别 都在这个答案中,这只是一个摘要。
1)这是我如何区分Model
与Migration
的方法
(基于功能):
Migration
(创建表,添加约束,.. etc)Model
使您作为开发人员可以更轻松地与数据库上与Model
(为之定义的模型)相对应的表进行交互,例如:A {{ 1}}模型可帮助您与 Users 表进行交互,而无需编写SQL查询。 2)User
方法为您提供了两种特殊功能,它们分别是 lazyLoading 和eagerLoading,它们都使您省去了Associate
的麻烦。
因此,再次“该模型使您免于自己编写原始SQL查询的麻烦。”