Création des modèles et des migrations
Maintenant que la conception du schéma de la base de données est achevée, il est temps de l'implémenter. Pour cela, on va utiliser sequelize-cli pour générer tous les fichiers de configuration.
1. Installation
Pour installer sequelize-cli, il faut exécuter cette commande :
npm install -g sequelize-cli
Sequelize-cli a besoin que Sequelize soit installé dans le projet pour fonctionner, il faut donc installer Sequelize localement :
npm install -S sequelize
2. Configuration
Maintenant que les deux commandes ci-dessus ont été exécutées, il est possible d'initialiser Sequelize. En exécutant cette commande, Sequelize va générer des fichiers dans notre projet qui nous permettront de se connecter facilement à la base de données.
sequelize init
L'architecture du projet
3. Création du model User
sequelize model:create --name="user" --attributes="username:string,email:string,password:string,deleted_at:date" --underscored
Par défaut, Sequelize utilise la méthode camelCase pour le nom des colonnes des bases de données. Cependant, il est plus simple d'écrire du code SQL en nommant les colonnes avec la convention de l'underscore. Pour que Sequelize prenne en compte l'underscore, on ajoute --underscored
en option dans la commande. Sequelize ajoute automatiquement les colonnes created_at
_et updated_at
_mais l'attribut deleted_at
doit être ajouté manuellement.
4. Mettre au singulier
Par défaut, Sequelize met au pluriel le nom de nos tables, user
devient users
, user_info
devient user_infos
. Cependant, il est plus pratique d'avoir le nom des tables au singulier, pour éviter ce genre d'évènement, city qui devient cities, et pour garder une cohérence entre le model (qui est au singulier) et la table. Pour forcer Sequelize à garder le singulier, il faut suivre ces deux étapes :
Se rendre dans le fichier de migration qui se trouve dans le dossier migrations et mettre au singulier le nom de la table, par exemple :
/* Avant */ queryInterface.createTable('users', {...})
/* Après */ queryInterface.createTable('user', {...})
Se rendre dans le fichier user, dans le dossier models et ajouter le pamètre _freezeTableName, _on en profitera pour ajouter le paramètre permettant de signifier à Sequelize qu'on souhaite ajouter le soft delete.
'use strict';
module.exports = function(sequelize, DataTypes) {
var user = sequelize.define('user', {
username: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING
}, {
underscored: true,
freezeTableName: true, // Freeze du nom de la table
paranoid: true, // Ajout du soft delete (Sequelize ajoute deleted_at)
classMethods: {
associate: function(models) {
// associations can be defined here
}
}
});
return user;
};
5. Création du model User_info
Pour user_info, il faut suivre les mêmes étapes que pour le model user, c'est à dire, créer le model avec la ligne de commande ci-dessous, et mettre au singulier la table.
sequelize model:create --name="user_info" --attributes="user_id:integer,last_name:string,first_name:string,birthdate:date" --underscored
Une fois que toutes ces étapes ont été réalisées, il ne manque plus qu'à modifier le fichier de migration de user_info dans le dossier migrations et indiquer à Sequelize que user_id est une clé étrangère reliant user_info à user.
'use strict';
module.exports = {
up: function(queryInterface, Sequelize) {
return queryInterface.createTable('user_info', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
user_id: {
type: Sequelize.INTEGER,
references: { // On ajoute la reference à la tablaes userc
model: 'user', // Le nom du model
key : 'id' // La valeur qui correspond à user_id
},
onUpdate : 'cascade', // Si user est mis à jour, alors les infos aussi
onDelete : 'cascade' // Si user est supprimé alors user_info sera détruit automatiquement
},
last_name: {
type: Sequelize.STRING
},
first_name: {
type: Sequelize.STRING
},
birthdate: {
type: Sequelize.DATE
},
created_at: {
allowNull: false,
type: Sequelize.DATE
},
updated_at: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: function(queryInterface, Sequelize) {
return queryInterface.dropTable('user_info');
}
};
- Migration
Maintenant que les fichiers de migrations ont été créé, que le model sont bien défini, alors, le script de migration peut être lancé.
Attention, la base de données doit être en cours d'exécution avec l'aide de Docker, comme vu dans la partie Mise en route
sequelize db:migrate