sequelize table without column 'id'

90,352

Solution 1

If you don't define a primaryKey then sequelize uses id by default.

If you want to set your own, just use primaryKey: true on your column.

AcademyModule = sequelize.define('academy_module', {
    academy_id: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});

Solution 2

If you want to completely disable the primary key for the table, you can use Model.removeAttribute. Be warned that this could cause problems in the future, as Sequelize is an ORM and joins will need extra setup.

const AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

Solution 3

For a composite primary key, you should add "primaryKey: true" to all columns part of the primary key. Sequelize considers such columns to be part of a composite primary key.

Solution 4

If your model does not have an ID column you can use Model.removeAttribute('id'); to get rid of it.

See http://docs.sequelizejs.com/en/latest/docs/legacy/

So in your case it would be

AcademyModule = sequelize.define('academy_module', {
    academy_id: DataTypes.INTEGER,
    module_id: DataTypes.INTEGER,
    module_module_type_id: DataTypes.INTEGER,
    sort_number: DataTypes.INTEGER,
    requirements_id: DataTypes.INTEGER
}, {
    freezeTableName: true
});
AcademyModule.removeAttribute('id');

Note: You seem to be making a join table. Consider making academy_id and module_id primary keys. That way the same link will not be able to appear multiple times, and the database will not create a hidden id column in vain.

Share:
90,352
Marc Rasmussen
Author by

Marc Rasmussen

SOreadytohelp Website

Updated on July 08, 2022

Comments

  • Marc Rasmussen
    Marc Rasmussen almost 2 years

    I have the following sequelize definition of a table:

    AcademyModule = sequelize.define('academy_module', {
            academy_id: DataTypes.INTEGER,
            module_id: DataTypes.INTEGER,
            module_module_type_id: DataTypes.INTEGER,
            sort_number: DataTypes.INTEGER,
            requirements_id: DataTypes.INTEGER
        }, {
            freezeTableName: true
    });
    

    As you can see there is not an id column in this table. However when I try to insert it still tries the following sql:

     INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);
    

    How can I disable the id function it clearly has?