我使用Sequelize作为我的服务器(使用mysql方言);在Sequelize的文档中写道:
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task)
Task.belongsTo(User)
使用约束自动创建外键引用; 但对我来说,这并没有发生:
var Shop = sequelize.define('Shop', {
name: Sequelize.STRING,
address: Sequelize.STRING,
phone: Sequelize.STRING,
email: Sequelize.STRING,
percentage: Sequelize.FLOAT,
text: Sequelize.TEXT,
categories: Sequelize.TEXT,
start: Sequelize.DATE,
end: Sequelize.DATE
});
var Offer = sequelize.define('Offer', {
name: Sequelize.STRING,
deadline: Sequelize.DATE,
optionDuration: Sequelize.INTEGER
});
Shop.hasMany(Offer);
Offer.belongsTo(Shop);
这创建了两个表商店和商品,它们都只有" id"主键
我也有一些n:m协会,如:
Group.hasMany(Accesslevel);
Accesslevel.hasMany(Group);
但在这种情况下,在Sequelize创建的连接表中,没有外键; 所以,如果我删除前。一个acccesslevel,不会删除连接表中相应的记录accesslevelsgroups。
有人知道我做错了什么或遗失了什么吗? 我需要的是为关联创建所有外键以及指定行为的可能性' onDelete'和' onUpdate' (级联)
- 更新 我已创建了执行同步的路由:
myServer.get('/sync', function (req, res) {
sequelize.sync({force: true}).success(function() {
console.log('sync done');
res.send(200, 'sync done');
}).error(function(error) {
console.log('there was a problem');
res.send(200, 'there was a problem');
});
});
然后在浏览器中输入127.0.0.1:port/sync来创建数据库结构
答案 0 :(得分:3)
创建表格后(在数据库中)是否添加了关系?
如果您修改计划并再次运行程序,则需要.sync({ force: true })
。
如果数据库中尚不存在该表,Sequelize将仅创建表及其所有引用。
在完成所有关联后,您是否正在调用同步?
您使用的是InnoDB吗?
奇怪的是,我可以重现这一点,最简单的解决方法是手动定义密钥,我认为,我是如何解决它的,否则可能是一个错误,我不确定。
见这里: http://sequelizejs.com/docs/latest/associations#block-3-line-24
答案 1 :(得分:0)
这个问题实际上已经得到回答here
由于琐碎的答案会转换为注释,因此很难注意到它们,因此我将在此处重复其要点。
要将引用约束添加到列,可以将onUpdate和onDelete选项传递给关联调用。 。 。
User.hasMany(任务,{onDelete:'SET NULL',onUpdate:'CASCADE'})
答案 2 :(得分:0)
您应该提供这样的外键,它与同步无关。
Offer.associate = function (models) {
models. Offer.belongsTo(models. Offer, {
onDelete: "CASCADE",
foreignKey: 'shopId',
targetKey: 'id'
});
};