我有以下表的续集定义:
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
功能?
如果您没有定义
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
});
如果要完全禁用表的主键,可以使用
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');
如果您的模型没有 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 列。
对于复合主键,您应该将“primaryKey: true”添加到主键的所有列部分。 Sequelize 认为此类列是复合主键的一部分。
如果您使用sequelize cli 来生成模型。
module.exports = (sequelize, DataTypes) => {
class follow extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
}
follow.init({
follower_id: DataTypes.INTEGER,
followee_id: DataTypes.INTEGER
}, {
sequelize,
modelName: 'follows',
});
follow.removeAttribute("id");
return follow;
};