Sequelize contre Prisma

Début

Actuellement chez eBay, je migre nos outils internes de MongoDB vers Postgres. Un projet très difficile, mais que je suis enthousiaste à l’idée d’attaquer de front. Au cours de mes recherches, j’ai déterminé que, pour notre base de code, l’utilisation d’un ORM serait la meilleure option, puisque la base de code avait déjà été conçue pour utiliser Mongoose. Mais maintenant, la question est : quel ORM serait le meilleur pour notre base de code ? Dans cet article, je vais approfondir cette question. Veuillez noter que je ne peux pas divulguer tout ce qui se trouve dans cet article en raison de la nature de mon contrat avec mon employeur.

Exigences

Après une analyse minutieuse des besoins du projet, j’ai établi les critères essentiels suivants que toute solution ORM devrait satisfaire :

  • Être un package JavaScript ; puisque la majeure partie du code est écrite en JavaScript
  • Doit prendre en charge Postgres et la plupart de ses fonctionnalités
  • Ses performances doivent être au moins équivalentes à celles de Mongoose, voire meilleures
  • Doit être open source et maintenu

ORM

Après avoir effectué beaucoup de recherches, j’ai déterminé que les trois principaux ORM qui correspondent aux exigences sont : Sequelize, Prisma et TypeORM. J’ai finalement décidé de me concentrer uniquement sur Sequelize et Prisma, car je n’avais pas le temps de tester complètement trois ORM différents en raison des délais.

Environnement de test

Pour mon environnement de test, j’ai exécuté Postgres via Docker. J’ai récupéré notre ensemble de données le plus volumineux et le plus complexe, je l’ai converti d’une structure de document en une structure de table, puis je l’ai ajouté à mon instance Postgres locale. J’ai converti l’ensemble de données en utilisant des colonnes, des relations un-à-un, des relations un-à-plusieurs et certaines colonnes JSONB.

À partir de là, j’écrirais du code JavaScript qui utilisait cet ORM spécifique et je mesurerais :

  • Combien de temps il faudrait pour créer une entrée
  • Combien de temps il faudrait pour mettre à jour une entrée
  • Combien de temps il faudrait pour mettre à jour une entrée imbriquée (relation et/ou clé-valeur dans un JSON)
  • Combien de temps il faudrait pour supprimer une entrée
  • Combien de temps il faudrait pour interroger/récupérer une entrée

J’ai créé des dépôts pour chaque environnement de test ORM. J’aimerais beaucoup partager ces dépôts, mais ils appartiennent techniquement à eBay, donc je ne peux pas les partager.

Résultats

Vers le 15 mai 2023, j’ai décidé que Sequelize était le meilleur ORM pour notre cas d’utilisation et qu’il serait l’ORM utilisé pour notre migration de MongoDB vers Postgres. En fin de compte, j’ai choisi Sequelize parce que :

  • C’était « véritablement open source » et non maintenu par une startup financée.
  • Prenait en charge la plupart des fonctionnalités de Postgres.
  • Offrait de bonnes performances, surtout comparé à Prisma.
  • Dispose d’une bonne documentation, bien qu’elle ne soit pas aussi bien documentée que celle de Prisma.

Je me suis arrêté sur Sequelize, mais j’ai aussi établi une liste des avantages et des inconvénients pour chaque ORM que j’ai testé dans l’espoir que cela aide les gens à mieux déterminer si Sequelize ou Prisma conviendrait à votre cas d’utilisation.

Avantages et inconvénients de Sequelize

Avantages :

  • Dispose d’une fonction sync() qui crée et gère automatiquement les tables pour vous
  • Peut gérer des jointures complexes (données imbriquées)
  • Prend en charge de nombreuses options de filtrage (comme Regex)
  • La représentation du modèle/schéma se fait en JavaScript brut à l’aide de classes hautement personnalisables.
  • Sequelize gère les connexions pour votre ou vos bases de données sélectionnées.
  • Sequelize prend en charge plusieurs connexions de lecture
  • Prend en charge les requêtes SQL brutes.
  • Au 15 mai 2023 :
    • Sur NPM, Sequelize a été mis à jour pour la dernière fois « il y a 14 jours » et compte 1 505 835 téléchargements hebdomadaires.
    • Sur GitHub, Sequelize a été mis à jour pour la dernière fois « hier », compte 4,2k forks et 27,9k étoiles.
    • Sequelize possède une licence MIT et est open source depuis plus de 10 ans. Il est donc très probable qu’il reste open source dans un avenir prévisible.

Inconvénients :

  • La représentation du modèle/schéma peut devenir très complexe et volumineuse. Par exemple, la représentation Mongoose de notre grand ensemble de données faisait environ 262 lignes (espaces compris). Le même ensemble de données représenté avec Sequelize fait 564 lignes (espaces compris).
  • La syntaxe de Sequelize devient vraiment confuse et compliquée dans certains cas.
  • Migrer votre base de données (la modifier) est très pénible. Vous pouvez utiliser sequelize-cli pour générer des scripts de modèle de migration JavaScript. MAIS, cela semble être le même cas pour presque tous les ORM. La migration dans une base de données relationnelle n’est pas facile dans la plupart des cas.
  • La documentation n’est pas si bonne. Elle s’est améliorée, mais nécessite encore du travail. Mais avec des outils comme ChatGPT, ce n’est plus un problème aussi important qu’avant, car ChatGPT comprend très bien Sequelize, probablement parce que Sequelize existe depuis une décennie.
  • Sequelize est moins sensible aux types que Prisma, ce qui pourrait entraîner des problèmes.
  • Il ne prend pas bien en charge TypeScript, ce qui, pour mon projet, n’est pas un problème, mais pourrait être un gros problème pour de nombreux autres projets.

Avantages et inconvénients de Prisma

Avantages :

  • Possède son propre langage de schéma. Cela signifie que vous pouvez créer votre schéma/modèle plus facilement et plus proprement. Par exemple, la représentation Mongoose de notre grand ensemble de données faisait environ 262 lignes (espaces compris). Mais le même ensemble de données représenté par Prisma ne faisait que 221 lignes (espaces compris).
  • Prisma dispose d’un outil CLI qui facilite la création et la migration (modification) de votre base de données. Ce qui est très pratique. Ce n’est pas une solution miracle, mais c’est la meilleure chose que j’aie vue jusqu’à présent dans un ORM.
  • Prend en charge les requêtes SQL brutes.
  • Le code de Prisma est propre et simple. Il faut tout de même apprendre sa syntaxe et s’y familiariser, mais elle est bien plus facile à comprendre que celle de Sequelize.
  • Prisma dispose d’un client qui génère automatiquement des générateurs de requêtes pour Node.js et TypeScript.
  • La documentation est très, très bonne et claire. ChatGPT peut toujours aider, mais il n’est pas aussi à jour sur Prisma qu’il l’est sur Sequelize.
  • Au 15 mai 2023 :
    • Sur NPM, Prisma a été mis à jour pour la dernière fois « il y a 6 jours » et compte 1 344 705 téléchargements hebdomadaires.
    • Sur GitHub, Prisma a été mis à jour pour la dernière fois « il y a 3 heures », compte 1,1k forks et 31,3k étoiles.

Inconvénients :

  • Ne prend pas en charge le filtrage Regex pour Postgres, mais propose des विकल्पs de filtre « contains », « includes » et « startsWith ».
  • D’après mes tests, Prisma est nettement plus lent pour créer les entrées de notre grand ensemble de données dans Postgres. Sequelize a créé ces grandes entrées à un rythme d’environ 2,26 secondes par entrée (fichier JSON). Alors que Prisma avait un rythme d’environ 11,21 secondes par entrée (fichier JSON). D’après ces résultats, Prisma est environ 5 fois plus lent que Sequelize pour cette tâche.
  • De plus, supprimer une entrée de ce grand ensemble de données a entraîné un temps d’attente de près de 4 minutes, ce qui est vraiment très mauvais.
  • Sequelize était bien plus rapide pour supprimer une entrée dans l’ensemble de données le plus grand et le plus complexe de mes tests. Sequelize n’avait pas d’avantage sur Prisma lorsqu’il s’agissait de la construction de l’ensemble de données. Les deux devaient gérer une relation à trois niveaux de profondeur pour ce grand ensemble de données, donc je dirais que c’était une comparaison équitable.
  • Prisma est une startup, ce qui signifie que Prisma est une entreprise à but lucratif financée à hauteur de 56,5 millions de dollars. Sachant cela, le code/package principal de l’ORM Prisma est open source avec une licence Apache-2.0. C’est bien, mais puisque Prisma a des investisseurs, je ne serais pas surpris s’ils faisaient comme MongoDB en ce qui concerne leur licence.

Sources