我们正在尝试使用Sequelize在PostgreSQL中自动创建表。不幸的是,它不会将外键创建为约束。以下是我的一个模型的示例:
module.exports = function(schema, DataTypes) {
var definition = {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
deal_id: {
type: DataTypes.INTEGER
},
image: DataTypes.STRING,
};
var image = schema.define('Image', definition, {
tableName: 'images', // this will define the table's name
timestamps: false, // this will deactivate the timestamp columns
syncOnAssociation: true,
classMethods: {
getDefinition: function() {
return definition;
},
associate: function(_models) {
image.belongsTo(_models.Product, {
foreignKey: 'deal_id'
});
}
}
});
return image;
};
我做错了吗?
答案 0 :(得分:4)
首先,ORM在内部处理这种事情并不常见,而不是在数据库中使用外键约束。
其次,ORM要求对关联语句触发您可能期望的所有内部处理并不罕见。
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task)
Task.belongsTo(User)
最后,Sequelize实际上会将外键声明写入数据库,但前提是你还要使用onUpdate
或onDelete
声明某种行为(或不行动)。
要向列添加引用约束,可以传递选项 onUpdate和onDelete到关联调用。 。 。
User.hasMany(Task, { onDelete: 'SET NULL', onUpdate: 'CASCADE' })
CREATE TABLE IF NOT EXISTS `Task` (
`id` INTEGER PRIMARY KEY,
`title` VARCHAR(255),
`user_id` INTEGER REFERENCES `User` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
);