Aller au contenu
Utilisation des classes ES6 pour les modèles Sequelize 4 ou 5
  1. Blogs/

Utilisation des classes ES6 pour les modèles Sequelize 4 ou 5

·628 mots·3 mins·

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:

const MyModel = sequelize.define('MyModel', {
  // fields and methods
});

Pour ajouter des méthodes de classes et d’instance, vous devez écrire ce qui suit:

// Class Method
MyModel.associate = function (models) {};
// Instance Method
MyModel.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:

class MyModel extends Sequelize.Model {
  static associate(models) {}
  someMethod() {}
}

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
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        myField: DataTypes.STRING,
      },
      { sequelize },
    );
  }
}

Associez votre modèle à d’autres modèles
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  static associate(models) {
    this.myAssociation = this.belongsTo(models.OtherModel);
    // or
    this.myAssociation = models.MyModel.belongsTo(models.OtherModel);
  }
}

Définition d’un nom de table personnalisé pour votre modèle
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        // field definitions
      },
      {
        tableName: 'myModels',
        sequelize,
      },
    );
  }
}

Définition d’un nom de modèle personnalisé pour votre modèle (pour Sequelize)
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  static init(sequelize, DataTypes) {
    return super.init(
      {
        // field definitions
      },
      {
        modelName: 'myModel',
        sequelize,
      },
    );
  }
}

Les requêtes
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  static getId(where) {
    return this.findOne({
      where,
      attributes: ['id'],
      order: [['createdAt', 'DESC']],
    });
  }
}

Méthodes d’instance
#

const Sequelize = require('sequelize');
class MyModel extends Sequelize.Model {
  getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

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.

const Sequelize = require('sequelize');
const sequelize = new Sequelize();
// pass your sequelize config here
const FirstModel = require('./first-model');
const SecondModel = require('./second-model');
const ThirdModel = require('./third-model');
const models = {
  First: FirstModel.init(sequelize, Sequelize),
  Second: SecondModel.init(sequelize, Sequelize),
  Third: ThirdModel.init(sequelize, Sequelize),
};
// Run `.associate` if it exists,
// ie create relationships in the ORM
Object.values(models)
  .filter(model => typeof model.associate === 'function')
  .forEach(model => model.associate(models));
const db = {
  ...models,
  sequelize,
};
module.exports = db;

Articles connexes

Sequelize DataTypes: guide pratique
·506 mots·3 mins
Les DataTypes sont au coeur de la bibliothèque Sequelize. Ceci est un guide pratique et complet pour compenser la documentation officielle clairsemée de Sequelize sur le sujet.
Démarrer avec Sequelize
·276 mots·2 mins
Introduction à l’ORM # ORM ou Object Relation Mapping est un processus de mappage entre des objets et des systèmes de base de données relationnels. Un ORM agit comme une interface entre deux systèmes.
Changer d'environnement Node.js
·506 mots·3 mins
Si vous travaillez sur plus d’un projet à la fois, travaillez beaucoup en open source ou si vous décidez de revenir à un projet que vous avez réalisé il y a un an, il y a de fortes chances pour que vous deviez changer de version de Node.