Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequelize doesn't create foreign keys as constraints

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

Am I doing something wrong?

like image 521
Erik van de Ven Avatar asked Sep 12 '25 13:09

Erik van de Ven


1 Answers

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

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)

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.

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

Code example source

like image 165
Mike Sherrill 'Cat Recall' Avatar answered Sep 16 '25 09:09

Mike Sherrill 'Cat Recall'