node.js - 插入数据时如何阻止 sequelize 创建不需要的主键?

标签 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: 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 会自动创建一个主键,该主键由两个引用创建关系的表(usersdoors 在你的情况下)

The table will be uniquely identified by the combination of the keys of the two tables

编辑

假设您已经在 usersdoors 模型上使用了 belongsToMany 有一种方法可以避免自动创建 user_uiddoor_uid 的唯一索引。您需要在 m:m 关系初始化的 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/

相关文章:

javascript - 无法访问除第一行之外的其他行的值

javascript - 将方法/变量注入(inject) Javascript 范围

postgresql - 未捕获 未捕获错误 : Unsupported operation: Socket constructor in dart with postgresql

node.js - Aerospike NodeJS UDF 聚合错误

python - Geoalchemy2 和 ST_Within - 点和多边形之间的类型不匹配?

postgresql - 如何找到消耗最多 I/O 的 postgresql 查询

node.js - 查询中的序列化查询

typescript - Sequelize.js:Model.build 返回一个空白对象

node.js - heroku Postgres - Sequelize 主机的 : no pg_hba. conf 条目

node.js - tsc 不转译 .at() 函数