Définition du modèle:
export default function(sequelize, DataTypes) {
return sequelize.define('Item', {
minor: DataTypes.INTEGER,
major: DataTypes.INTEGER,
});
}
Puis-je définir la paire mineur et majeur comme une contrainte UNIQUE composite?
Récemment, dans V4, Sequelize a ajouté ceci à l'interface de requête:
queryInterface.addConstraint('Items', ['minor', 'major'], {
type: 'unique',
name: 'custom_unique_constraint_name'
});
Voici la réponse simple:
major: { type: DataTypes.INTEGER, unique: 'compositeIndex'},
minor: { type: DataTypes.INTEGER, unique: 'compositeIndex'}
source: http://docs.sequelizejs.com/en/latest/docs/models-definition/
Vous pouvez également créer une contrainte unique via les associations l'appartenance à beaucoup s'il s'agit d'une table de jointure:
Major = sequelize.define('major', {})
Minor = sequelize.define('minor', {})
Major.belongsToMany(Project)
Minor.belongsToMany(User)
Source: http://docs.sequelizejs.com/en/v3/docs/associations/
Dans mon cas, je voulais trouver un moyen d'imposer cela avec ma migration. Je l'ai fait en ajoutant une requête SQL brute à la fin de ma fonction up:
up: function(queryInterface, Sequelize) {
return queryInterface.createTable('Item', {
major: {
allowNull: false,
type: Sequelize.INTEGER
},
minor: {
allowNull: false,
type: Sequelize.INTEGER
},
})
.then(function() {
return queryInterface.sequelize.query(
'ALTER TABLE `Item` ADD UNIQUE `unique_index`(`major`, `minor`)'
);
});
Questions connexes:
Sequelize, clés étrangères comme clé primaire composite
Contrainte unique sur les clés étrangères dans le modèle Sequelize
queryInterface.createTable('Item', {
minor: {
type: Sequelize.INTEGER,
},
major: {
type: Sequelize.INTEGER,
}
}, {
uniqueKeys: {
Items_unique: {
fields: ['minor', 'major']
}
}
});
Pour les migrations ES6
const item = {
up: (queryInterface, Sequelize) => queryInterface.createTable('Items', {
minor: {
type: Sequelize.INTEGER,
allowNull: false,
},
major: {
type: Sequelize.INTEGER,
allowNull: false,
},
}).then(() => queryInterface.addConstraint('Items', ['minor', 'major'], {
type: 'unique',
name: 'composite_key_name'
})),
down: queryInterface => queryInterface.dropTable('Items')
};
export default item;
Vous pouvez utiliser quelque chose comme ceci:
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction(t => {
return queryInterface.createTable('item',
{
minor: {
type: Sequelize.INTEGER,
},
major: {
type: Sequelize.INTEGER,
}
}, { transaction: t }
).then(() => {
return queryInterface.addConstraint(
'item',
['minor', 'major'],
{
type: 'unique',
name: 'Items_unique'
},
{
transaction: t
}
);
});
});
},
down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('item');
}
}
export default function(sequelize, DataTypes) {
return sequelize.define('Item', {
minor: {
DataTypes.INTEGER,
unique: true //add
},
major: {
DataTypes.INTEGER,
unique: true //add
}
});
}