Node.js 如何在插入数据时阻止sequelize创建不需要的主键?
我有一个没有主键的sequelize模型:Node.js 如何在插入数据时阻止sequelize创建不需要的主键?,node.js,postgresql,sequelize.js,Node.js,Postgresql,Sequelize.js,我有一个没有主键的sequelize模型: module.exports = (sequelize, DataTypes) => { const usersDoors = sequelize.define('usersDoors', { user_uid: { type: DataTypes.UUID, allowNull: false, }, door_uid: { type: DataTyp
module.exports = (sequelize, DataTypes) => {
const usersDoors = sequelize.define('usersDoors',
{
user_uid: {
type: DataTypes.UUID,
allowNull: false,
},
door_uid: {
type: DataTypes.UUID,
allowNull: false,
},
property_manager_uid: {
type: DataTypes.UUID,
allowNull: true,
},
tenant_uid: {
type: DataTypes.UUID,
allowNull: true,
},
created_at: {
type: DataTypes.INTEGER,
allowNull: false,
},
},
{
tableName: 'users_doors',
indexes: [
{
name: 'doors_users_indexes',
unique: true,
fields: ['user_uid', 'door_uid', 'property_manager_uid', 'tenant_uid'],
},
],
classMethods: {
associate: (models) => {
usersDoors.belongsTo(models.users, { foreignKey: 'user_uid' });
usersDoors.belongsTo(models.doors, { foreignKey: 'door_uid' });
usersDoors.belongsTo(models.propertyManagers, { foreignKey: 'property_manager_uid' });
usersDoors.belongsTo(models.tenants, { foreignKey: 'tenant_uid' });
},
},
});
return usersDoors;
};
当我插入数据(通过sequelize)时,sequelize会向表中添加一个复合主键,其中包括前两列(user\u uid和door\u uid)。这是在破坏我的东西,我不想要它
插入数据时,如何停止sequelize创建不需要的主键
更多详情:
- 方言:postgresql
- sequelize(节点包)版本:3.30.2
- postgresql版本:psql(9.6.1,服务器9.5.5)
- 节点版本(这与任何事情都无关):6.9.1
const tableName = 'users_doors';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.createTable(tableName, {
user_uid: {
type: Sequelize.UUID,
allowNull: false,
references: {
model: 'users',
key: 'uid',
},
},
door_uid: {
type: Sequelize.UUID,
allowNull: false,
references: {
model: 'doors',
key: 'uid',
},
},
property_manager_uid: {
type: Sequelize.UUID,
allowNull: true,
references: {
model: 'property_managers',
key: 'uid',
},
},
tenant_uid: {
type: Sequelize.UUID,
allowNull: true,
references: {
model: 'tenants',
key: 'uid',
},
},
created_at: {
type: Sequelize.INTEGER,
allowNull: false,
},
})
.then(() => {
return queryInterface.addIndex('users_doors',
['user_uid', 'door_uid', 'property_manager_uid', 'tenant_uid'],
{
indexName: 'doors_users_indexes',
indicesType: 'UNIQUE',
});
});
},
down: (queryInterface) => {
return queryInterface.dropTable(tableName)
.then(() => {
return queryInterface.removeIndex('users_doors', ['user_uid', 'door_uid', 'property_manager_uid', 'tenant_uid']);
});
},
};
您只需要向sequelize模型以及迁移添加属性,这将是您的主键
// in sequelize model definition
const usersDoors = sequelize.define('usersDoors',
{
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
user_uid: {
type: DataTypes.UUID,
allowNull: false,
},
// other fields
// in the migrations file
return queryInterface.createTable(tableName, {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
user_uid: {
type: Sequelize.UUID,
allowNull: false,
references: {
model: 'users',
key: 'uid',
},
},
// other fields
根据文档,当您创建M:M关系时,sequelize会自动创建一个主键,该主键由两个外键组成,这些外键引用了创建关系的表(users
和doors
)
该表将通过两个表的键的组合进行唯一标识
编辑
假设您在用户
和门
模型上都使用了唯一索引
,有一种方法可以避免在用户uid
和门uid
上自动创建唯一索引。您需要在m:m关系初始化的到
对象中指定unique:false
条件(在这两种模型中,以避免任何自动唯一约束)
这种方式与sequelize中的方式一样,不会创建额外的主键,但是现在它在这两列上发明了一个唯一的约束,你会注意到我实际上设置的唯一约束是在4列上……我已经更新了关于自动唯一约束的答案。我只是删除了belongTomany关联,并用multiple hasMany and替换了它们属于协会。这解决了问题,现在剩下的唯一一个小问题是sequelize正在创建一个id
列作为主键,这是我从未要求过的。然而,我可以接受这一点,因为我可以简单地忽略这个专栏。您的解决方案是否也能防止这个不太麻烦的问题发生?关于usersDoors.removeAttribute('id')
?根据文档:“如果您的模型根本没有主键,您可以使用model.removeAttribute('id');”添加unique:false
就是解决方案。它也适用于model.belongsTo
的情况。我在使用include
选项时遇到了这个问题。我希望这能帮助别人
// in users model
users.belongsToMany(
models.doors,
{
through: { model: models.usersDoors, unique: false },
foreignKey: 'user_uid'
}
);
// in doors model
doors.belongsToMany(
models.users,
{
through: { model: models.usersDoors, unique: false },
foreignKey: 'door_uid'
}
);