Sequelize不会创建外键作为约束 [英] Sequelize doesn't create foreign keys as constraints

查看:555
本文介绍了Sequelize不会创建外键作为约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试使用Sequelize在PostgreSQL内部自动创建表。不幸的是,它没有创建外键作为约束。这是我的一个模型的示例:

We're trying to create tables automatically inside PostgreSQL using Sequelize. Unfortunately, it doesn't create the foreign keys as constraints. Here is an example of one of my models:

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;
};

我做错了吗?

推荐答案

首先,ORM在内部处理这种事情而不是通过在数据库中使用外键约束来处理这种情况并不少见。

First, it's not uncommon for ORMs to handle this kind of thing internally rather than by using foreign key constraints in the database.

其次,ORM要求关联语句的 pair 来触发您可能期望的所有内部处理并不少见。

Second, it's not uncommon for ORMs to require a pair of association statements to trigger all the internal handling you might expect.

var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
  , User = this.sequelize.define('User', { username: Sequelize.STRING })

User.hasMany(Task)
Task.belongsTo(User)

最后,Sequelize实际上会将外键声明写入数据库,但前提是您还必须使用 onUpdate 或<$ c声明某种操作(或不作为) $ c> onDelete 。

Finally, Sequelize will actually write foreign key declarations into the database, but only if you also declare some kind of action (or inaction) with onUpdate or onDelete.


要向列添加引用约束,可以传递选项
onUpdate和onDe让协会电话。 。 。

To add references constraints to the columns, you can pass the options onUpdate and onDelete to the association calls. . . .



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
);

代码示例来源

这篇关于Sequelize不会创建外键作为约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆