2017-02-17 20 views
0

我有沒有任何主鍵的sequelize模型:插入數據時,如何停止創建不想要的主鍵時出現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增加了一個複合主鍵包括第一2列(user_uid和door_uid)的表。這是破壞我的東西,我不想要它。

如何在插入數據時停止創建不需要的主鍵的後綴化?

更多細節:

  • 方言:在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']); 
     }); 
    }, 
}; 

回答

0

你只需要添加屬性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)的關係

該表將是唯一identifi主鍵由您在兩個usersdoors模型中使用的belongsToMany兩個表

EDIT

假設的鍵的組合編有避免自動創建unique indexuser_uid的方式和door_uid。您需要指定在M的through對象unique: false條件:M關係初始化(在兩個模型,以避免任何自動唯一約束)

// 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' 
    } 
); 
+0

這類作品在sequelize不會產生額外的主鍵,但現在它正在發明一個獨特的約束,在那些相同的2列,你會發現我實際設置的唯一約束是在4列...... – Shawn

+0

我已經更新了有關自動「唯一」約束的答案。 – piotrbienias

+0

我最終刪除了belongsToMany關聯,並用多個hasMany和belongsTo關聯替換它們。這解決了問題,現在剩下的唯一小問題是sequelize正在創建一個「id」列作爲主鍵,這是我從未要求過的。這我可以忍受,但因爲我可以簡單地忽略那一欄。你的解決方案是否也會阻止這個不太麻煩的問題發生? – Shawn

相關問題