没有列'id'的续集表

Mar*_*sen 47 javascript mysql node.js sequelize.js

我有一个表的下面的sequelize定义:

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});
Run Code Online (Sandbox Code Playgroud)

如您所见id,此表中没有列.但是,当我尝试插入它仍然尝试以下sql:

 INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);
Run Code Online (Sandbox Code Playgroud)

如何禁用id它清楚的功能?

Ben*_*une 69

如果您没有默认定义一个primaryKeysequelize使用id.

如果您想自己设置,只需primaryKey: true在列上使用即可.

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
});
Run Code Online (Sandbox Code Playgroud)

  • 无视上述情况,Sequelize确实支持这一点.只需将`primaryKey:true`添加到要用作主键的列即可. (14认同)
  • 为什么这甚至被视为答案?问题非常清楚"我怎么能禁用它显然具有的`id`功能?" 这个答案试图回答"如果你想要你可以改变主键的名称".什么?? (6认同)
  • 根据[sequelize configurtion](http://docs.sequelizejs.com/en/latest/docs/models-definition/#configuration),可以定义哪个现有/已定义的字段将是`id`(你可以将多个fild设置为`primaryKey:true`)如果你的桌子上没有id,那么[sequelize legazy](http://docs.sequelizejs.com/en/latest/docs/legacy/)文档说你可以只需使用`Model.removeAttribute('id');`删除它,你将拥有一个没有主键的表(模型). (4认同)
  • 如果module_id和academy_id都是primaryKey怎么办? (2认同)

Ben*_*une 21

如果要完全禁用表的主键,则可以使用Model.removeAttribute.请注意,这可能会导致将来出现问题,因为Sequelize是一个ORM,并且连接需要额外的设置.

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');
Run Code Online (Sandbox Code Playgroud)


小智 11

对于复合主键,应将"primaryKey:true"添加到主键的所有列部分.Sequelize认为这些列是复合主键的一部分.


And*_*eas 7

如果您的模型没有ID列,则可以使用Model.removeAttribute('id'); 摆脱它。

参见http://docs.sequelizejs.com/en/latest/docs/legacy/

所以在你的情况下

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');
Run Code Online (Sandbox Code Playgroud)

注意: 您似乎正在建立联接表。考虑使用主键academy_id module_id主键。这样,同一链接将无法多次出现,并且数据库也不会白白创建隐藏的id列。