首页 文章

未创建具有Sequelize的外键

提问于
浏览
5

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

1 回答

  • 3

    在创建表(在数据库中)后添加了关系吗?
    如果您的方案在数据库中尚不存在,则需要 .sync({ force: true }) 修改您的方案's and run your program again. Sequelize will only create the table and all it' .

    在完成所有关联后,您是否正在调用同步?

    你在使用InnoDB吗?

    奇怪的是,我可以重现这一点,最简单的解决方法是手动定义密钥,我认为,这就是我解决它的方式,否则可能是一个错误,否则我不确定 .

    看这里:http://sequelizejs.com/docs/latest/associations#block-3-line-24

相关问题