Pourquoi je choisis Prisma plutôt que Drizzle ou Supabase ?

Publiée le 19 février 2024 · Temps de lecture de 5 minutes · Publié par Melvynx

Pourquoi choisir Prisma pour faire une application ?

Dans cet article, on va voir :

  1. Ce que j'adore chez Prisma
  2. Comparaison avec les autres

Pourquoi j'aime Prisma ?

Il y a 3 raisons que je vais pouvoir décomposer ici :

  1. Un DX incroyable avec le fichier prisma.schema
  2. Une communauté et documentation incroyables
  3. Une simplicité d'utilisation

DX

L'expérience de développement avec Prisma est vraiment très simple.

Tu peux installer une extension pour avoir la coloration syntaxique et l'autocomplétion.

Mais surtout l'affichage des erreurs :

Tu évites de faire des erreurs de syntaxe qui pourraient te faire perdre des heures.

Puis leur CLI est trop simple.

Tu as envie de faire une migration ?

npx prisma migrate dev

Le CLI te demande le nom, il te crée un fichier de migration et l'applique.

Surtout qu'après, il génère un module @prisma/client qui te permet d'interagir avec ta database en 100% TypeSafe.

Puis tous les types sont automatiquement corrects :

Souvent, pour certains composants, je viens utiliser le type généré par une requête pour les props :

export const getUser = (userId: string) => {
  return prisma.user.findFirst({
    select: {
      id: true,
      email: true,
      name: true,
    },
    where: {
      id: userId,
    },
  });
};

export type User = Prisma.PromiseReturnType<typeof getUser>;

const UserDisplay = ({ user }: { user: User }) => {
  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
    </div>
  );
};

Maintenant, imagine que demain tu souhaites rajouter un champ age à ton utilisateur.

Il te suffit de le sélectionner dans la méthode getUser et automatiquement le composant UserDisplay aura le type User mis à jour.

export const getUser = (userId: string) => {
  return prisma.user.findFirst({
    select: {
      id: true,
      email: true,
      name: true,
      age: true,
    },
    where: {
      id: userId,
    },
  });
};

export type User = Prisma.PromiseReturnType<typeof getUser>;

const UserDisplay = ({ user }: { user: User }) => {
  return (
    <div>
      <h1>{user.name}</h1>
      <p>{user.email}</p>
      <p>{user.age}</p>
    </div>
  );
};

Tu ne sais pas combien d'heures j'ai gagnées avec ceci.

Communauté et documentation

Prisma, c'est 36 000 étoiles sur GitHub en février 2024.

C'est aussi 2 900 issues ouvertes et 9 000 questions sur StackOverflow.

Cette techno est assez vieille pour que ChatGPT soit très très bon à créer des schémas Prisma et à déboguer ton code.

Sans parler de la documentation qui couvre presque tous les cas imaginables :

  • Comment tester ? https://www.prisma.io/docs/orm/prisma-client/testing/integration-testing
  • Prisma avec Next.js ? https://www.prisma.io/docs/orm/more/help-and-troubleshooting/help-articles/nextjs-prisma-client-dev-practices#solution
  • Extension de Prisma ? https://www.prisma.io/docs/orm/prisma-client/client-extensions/model

Bref, tout y est et ils ont pensé à tout.

Simplicité

Finalement, ce que j'aime le plus, c'est la syntaxe et les mots qui sont si simples quand on les compare au SQL.

Tu veux récupérer un utilisateur ? .user.findFirst

Tu veux créer un utilisateur ? .user.create

Tu veux mettre à jour un utilisateur ? .user.update

Tout est logique et tu sais presque déjà utiliser Prisma si tu as déjà fait du JavaScript et un peu de SQL.

Comparaison avec les alternatives

Pour Prisma, il y a deux alternatives que je pourrais citer ici.

Supabase

Tu peux utiliser une base de données Supabase avec l'ORM Prisma, mais ils proposent aussi leur propre ORM :

const { error } = await supabase
  .from("countries")
  .update({ name: "Australia" })
  .eq("id", 1);

Personnellement, je le déteste.

Pas de TypeSafe, il faut deviner les noms, prompt aux erreurs multiples.

Ensuite, si tu veux une base de données, je ne te conseille pas Supabase. 20$ / mois, c'est quand même cher quand tu sais que tu peux avoir une base de données pour 7$ / mois chez DigitalOcean ou Render.

ℹ️ 20$/mois par organisation, pour un nombre illimité de bases de données et de stockage. C'est pas trop mal si tu as plusieurs projets.

Drizzle

C'est une super alternative et qui propose une syntaxe très similaire à Prisma

// Drizzle
const result = await db.query.users.findMany({
  with: {
    posts: true,
  },
});

// Prisma
const result = await prisma.user.findMany({
  include: {
    posts: true,
  },
});

Donc la syntaxe est bonne, tout est TypeSafe exactement comme Prisma.

Mais voici ce que j'aime moins :

  • Schéma plus "compliqué"

Voici comment on crée un schéma :

import { serial, text, pgTable, pgSchema } from "drizzle-orm/pg-core";

export const mySchema = pgSchema("my_schema");

export const mySchemaUsers = mySchema.table("users", {
  id: serial("id").primaryKey(),
  name: text("name"),
});

L'avantage, c'est que tu peux utiliser du JavaScript pour mettre des noms de variables ou autre...

Le problème, c'est que c'est beaucoup plus verbeux et moins "simple" que Prisma, non pas que ce soit compliqué, mais c'est plus long à écrire.

  • Communauté

Drizzle reste une technologie très "early" et qui n'a pas encore été aussi éprouvée, sur StackOverflow c'est 700 questions VS 9'000 pour Prisma.

Finalement, vu que c'est early, bah... ChatGPT ne connaît pas du tout cette ORM.

Alors oui, c'est un problème de riche, mais personnellement pour ce genre de chose, avoir ChatGPT, surtout si tu n'es pas calé, c'est vraiment pratique.

Exemple :

Conclusion

Voici pourquoi j'ai choisi et je choisirais encore Prisma pour mes prochains projets.

Si tu veux créer rapidement un projet avec Prisma qui est déjà lié à NextAuth, tu peux checker NOW.TS :

Récupère ton accès NOW.TS, la boilerplate Next.js pour créer des applications de PRO peu importe ton niveau.

Profite d'un cours complet afin de créer des applications SaaS rapidement et efficacement.

PrivacyTermsapp icon