在处理mysql数据库时,我使用的是sequelize-cli迁移。
如果我键入以下命令
sequelize init将创建两个文件夹models和migrations
另外,如果我设置两个模型之间的关联,例如
User.hasMany(Posts)我必须手动将外键添加到迁移文件中。
(但不是模型文件,对吗?)
此外,迁移文件中还包含created_at、updated_at等列
但不在模型文件中。
当涉及到使用db.sync();时,没有这样的迁移文件,所以我不必手动将外键指向模型文件。
我知道迁移文件只与db表模式有关,但是模型文件到底在做什么呢?
该模型文件与db表无关吗?
我理解同步和迁移之间的区别,(同步删除所有表,如果要设置force:true,但不设置迁移)
但也许我无法理解内部发生了什么(迁移之间的模型)
任何建议都将不胜感激!
发布于 2018-05-23 15:53:09
当您使用sequelize-cli时,已经为您创建了createdAt和updatedAt列,因为sequelize使用它们来更新表。您可以禁用它们。
sequelize模型文件不需要createdAt和updatedAt来定义更改,因为它们是由sequelize完成的。
您必须手动将外键添加到迁移文件和模型中。模型文件是sequelize与数据库模式交互的参考。
它为sequelize设置参数,以触发对数据库的查询。您可以说迁移文件与您的数据库模式有关,而模型文件与您的数据库中存储的数据有关。
例如,考虑用户表及其basicinfo。
用户模型
module.exports = (sequelize, DataTypes) => {
var Users = sequelize.define('users', {
user_id: {
type: DataTypes.STRING,
primaryKey: true,
},
}, {});
User.associate = function(models) {
Users.hasOne(models.basicinfo, {
foreignKey: 'user_id',
as: 'BasicInfo'
});
};
return Users;
};基本信息模型
module.exports = (sequelize, DataTypes) => {
var basicinfo = sequelize.define('basicinfo', {
first_name: {
type: DataTypes.STRING,
},
last_name: {
type: DataTypes.STRING,
},
};{});
basicinfo.associate = function (models) {
basicinfo.belongsTo(models.users, {
foreignKey: 'user_id',
onDelete: 'CASCADE'
});
};
return basicinfo;
};希望这能消除你的困惑,当你使用这个伟大的库时,你会学到更多。
这是我对每个模型的迁移文件的更新答案。
user-migration
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('users', {
user_id: {
type: Sequelize.STRING,
primaryKey: true,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('users');
}
};basicinfo-migration
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable('basicinfo', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
user_id: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
onDelete: 'CASCADE',
references: {
model: 'users',
key: 'user_id',
as: 'user_id'
}
},
profile_img: {
type: Sequelize.STRING
},
first_name: {
type: Sequelize.STRING,
},
last_name: {
type: Sequelize.STRING,
},
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('basicinfo');
}
};https://stackoverflow.com/questions/50444226
复制相似问题