【问题标题】:Sequelize doesn't create foreign keys as constraintsSequelize 不会创建外键作为约束
【发布时间】:2014-12-12 20:12:24
【问题描述】:

我们正在尝试使用 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;
};

我是不是做错了什么?

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    首先,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 实际上会将外键声明写入数据库,但前提是您还使用 onUpdateonDelete 声明了某种动作(或不动作)。

    要向列添加引用约束,您可以传递选项 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
    );
    

    Code example source

    【讨论】:

    • 谢谢,明确答复。没有阅读文档中的那部分,我的错误。谢谢!
    • 剩下一个问题:如何定义外键?如果我在对象中添加外键,它不会创建约束,如果我不这样做,它会自己创建一个驼峰式外键。
    • 据我了解,您没有在 Sequelize 中定义外键。相反,您在关联中设置 onDelete 或 on Update 选项。
    • @Charlie:感谢您捕获死链接。我认为它只是记录了我从中复制最后一个代码块的位置。我在他们当前的网站上找不到它,archive.org 似乎没有副本。我会考虑删除它,但我也在考虑将死链接留在原处,作为 Sequelize 对重定向和更新网页的影响无动于衷的一种文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多