La spécification ES2015 ou ES6 a introduit la class
en JavaScript. Des bibliothèques telles que React sont passées de React.createClass
à la class MyComponent extends React.Component
, c’est-à-dire qu’ils sont passés de l’utilisation de leur propre constructeur à l’utilisation d’un langage intégré pour transmettre l’intention du programmeur.
Pour la couche de persistance d’une application Web Node.js, quelques bases de données me viennent à l’esprit, comme MongoDB (éventuellement associé à mongoose), ou une association de clés-valeurs comme Redis.
Pour exécuter une base de données relationnelle avec une application Node, Sequelize , “Un ORM de dialecte multi-SQL facile à utiliser pour Node.js” est une bonne option. Il permet à l’application de fonctionner avec une instance MySQL ou PostgreSQL et offre un moyen simple de mapper la représentation des entités dans la base de données vers JavaScript et inversement.
Les API v4 et inférieure de Sequelize pour les définitions de modèle se présentent comme suit:
Pour ajouter des méthodes de classes et d’instance, vous devez écrire ce qui suit:
1// Class Method
2MyModel.associate = function (models) {};
3// Instance Method
4MyModel.prototype.someMethod = function () {..}
Cela est nécessaire avant l’ES6 car il n’existait pas de notion d’héritage classique. Maintenant, nous avons les classes, pourquoi ne pas les exploiter? Pour les développeurs habitués à avoir des classes, les éléments suivants vous sembleront probablement familiers:
Sequelize supporte réellement cela, mais la documentation manque un peu. L’un des seuls endroits où trouver une référence à la procédure à suivre est dans un numéro de GitHub: https://github.com/sequelize/sequelize/issues/6524.
Voici un aide-mémoire sur ce que vous souhaitez faire et comment le réaliser à l’aide de la classe ES6 + héritage de Sequelize.Model
:
- Initialiser le modèle avec le ou les champs saisis
- Associez votre modèle à d’autres modèles
- Définition d’un nom de table personnalisé pour votre modèle
- Définition d’un nom de modèle personnalisé pour votre modèle (pour Sequelize)
- Les requêtes
- Méthodes d’instance
- Initialisez tous vos modèles
Initialiser le modèle avec le ou les champs saisis
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 static init(sequelize, DataTypes) {
4 return super.init(
5 {
6 myField: DataTypes.STRING,
7 },
8 { sequelize },
9 );
10 }
11}
Associez votre modèle à d’autres modèles
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 static associate(models) {
4 this.myAssociation = this.belongsTo(models.OtherModel);
5 // or
6 this.myAssociation = models.MyModel.belongsTo(models.OtherModel);
7 }
8}
Définition d’un nom de table personnalisé pour votre modèle
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 static init(sequelize, DataTypes) {
4 return super.init(
5 {
6 // field definitions
7 },
8 {
9 tableName: 'myModels',
10 sequelize,
11 },
12 );
13 }
14}
Définition d’un nom de modèle personnalisé pour votre modèle (pour Sequelize)
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 static init(sequelize, DataTypes) {
4 return super.init(
5 {
6 // field definitions
7 },
8 {
9 modelName: 'myModel',
10 sequelize,
11 },
12 );
13 }
14}
Les requêtes
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 static getId(where) {
4 return this.findOne({
5 where,
6 attributes: ['id'],
7 order: [['createdAt', 'DESC']],
8 });
9 }
10}
Méthodes d’instance
1const Sequelize = require('sequelize');
2class MyModel extends Sequelize.Model {
3 getFullName() {
4 return `${this.firstName} ${this.lastName}`;
5 }
6}
Initialisez tous vos modèles
require()
suivi de model.init()
est une alternative à sequelize.import(path)
, il est un peu plus clair ce qui est importé et non importé et sous quel nom.
1const Sequelize = require('sequelize');
2const sequelize = new Sequelize();
3// pass your sequelize config here
4const FirstModel = require('./first-model');
5const SecondModel = require('./second-model');
6const ThirdModel = require('./third-model');
7const models = {
8 First: FirstModel.init(sequelize, Sequelize),
9 Second: SecondModel.init(sequelize, Sequelize),
10 Third: ThirdModel.init(sequelize, Sequelize),
11};
12// Run `.associate` if it exists,
13// ie create relationships in the ORM
14Object.values(models)
15 .filter(model => typeof model.associate === 'function')
16 .forEach(model => model.associate(models));
17const db = {
18 ...models,
19 sequelize,
20};
21module.exports = db;