Sequelize不会创建外键作为约束

Eri*_*Ven 2 postgresql sequelize.js

我们正在尝试使用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;
};
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

Mik*_*ll' 5

首先,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)
Run Code Online (Sandbox Code Playgroud)

最后,Sequelize实际上会将外键声明写入数据库,但前提是您还必须使用onUpdateor 声明某种动作(或不动作)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
);
Run Code Online (Sandbox Code Playgroud)

代码示例源