我有一个没有任何主键的 Sequelize 模型:
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_uid 和 door_uid)的表中。这会破坏我的东西,我不想要它。
如何阻止 sequelize 在插入数据时创建不需要的主键?
更多详情:
- 方言:postgresql
- sequelize( Node 包)版本:3.30.2
- postgresql 版本:psql (9.6.1, server 9.5.5)
- Node 版本(这与任何事情无关):6.9.1
最后,这是此模型的 Sequelize 迁移:
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
在你的情况下)
The table will be uniquely identified by the combination of the keys of the two tables
编辑
假设您已经在 users
和 doors
模型上使用了 belongsToMany
有一种方法可以避免自动创建
。您需要在 m:m 关系初始化的 user_uid
和 door_uid
的唯一索引through
对象中指定 unique: false
条件(在两种模型中都避免任何自动唯一约束)
// 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'
}
);
关于node.js - 插入数据时如何阻止 sequelize 创建不需要的主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308315/