未创建具有Sequelize的外键

时间:2014-06-19 15:04:24

标签: node.js sequelize.js

我使用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来创建数据库结构

3 个答案:

答案 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'
    });
};