我有一个表的下面的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});
正如您所看到的,此表中没有id
列。但是,当我尝试插入它仍然尝试以下sql:
INSERT INTO `academy_module` (`id`,`academy_id`,`module_id`,`sort_number`) VALUES (DEFAULT,'3',5,1);
如何禁用显式的id
功能?
答案 0 :(得分:54)
如果您没有定义primaryKey
,则默认情况下,续集使用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
});
答案 1 :(得分:16)
如果要完全禁用表的主键,可以使用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');
答案 2 :(得分:9)
对于复合主键,您应该将“primaryKey:true”添加到主键的所有列部分。 Sequelize认为这些列是复合主键的一部分。
答案 3 :(得分:5)
如果您的模型没有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');
注意:强>
你似乎在制作一个连接表。考虑制作academy_id
和 module_id
主键。这样,相同的链接将无法多次出现,并且数据库不会徒劳地创建隐藏的id列。
答案 4 :(得分:0)
在这个解决方案中,sequelize
添加了带有列名 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
});