sequelize table sans colonne 'id'

j'ai le texte suivant sequelize définition d'une 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});

Comme vous pouvez le voir il n'y a pas un id colonne de ce tableau. Cependant lorsque j'essaie d'insérer, il tente encore le sql suivant:

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

Comment puis-je désactiver l' id fonction qu'il a clairement?

28
demandé sur Marc Rasmussen 2015-03-24 16:27:17

4 réponses

Si vous ne définissez pas un primaryKey puis sequelize utilise id par défaut.

Si vous souhaitez définir votre propre, il suffit d'utiliser primaryKey: true sur votre colonne.

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
});
42
répondu Ben Fortune 2015-03-24 13:36:50

pour une clé primaire composite, vous devez ajouter "primaryKey: true" à toutes les colonnes de la clé primaire. Sequelize considère que ces colonnes font partie d'une clé primaire composite.

9
répondu gaurav 2015-11-06 06:48:36

Si vous souhaitez désactiver complètement la clé primaire de la table, vous pouvez utiliser Model.removeAttribute. Soyez averti que cela pourrait causer des problèmes à l'avenir, car Sequelize est un ORM et joins aura besoin de configuration supplémentaire.

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');
9
répondu Ben Fortune 2016-08-10 11:04:06

si votre model n'a pas de colonne ID, vous pouvez utiliser Model.removeAttribute ("id"); pour se débarrasser de lui.

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

Donc dans votre cas il serait

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

Remarque: On dirait que tu fais une table commune. Envisagez de faire academy_idetmodule_id les clés primaires. De cette façon, le même lien ne pourra pas apparaître plusieurs fois, et la base de données ne créera pas une colonne d'identification cachée en vain.

1
répondu Andreas 2016-08-10 11:12:26