1 min read

Prisma Seed

Il est primordial que toutes les commandes terminal doivent être exécuté dans le répertoire racine du projet prisma. Autrement on risque les comportement inattendu, sans garantie d'une erreur explicite.

Seed est un typescript exécuté après création d'un schéma pour prépeupler des tables.
L'emplacement conventionnel se trouve àprisma/seed.ts`

Il est tout à fait possible utiliser les autres emplacements. Toutefois il faut specifier en package.json :

  "prisma": {
    "seed": "ts-node prisma/seed.ts"

Un exemple

import 'dotenv/config';
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  const domainNames = [
    'MECHANICS',
    'THERMODYNAMICS',
    'OPTICS',
    'ELECTROMAGNETISM',
    'QUANTUM_PHYSICS',
    'RELATIVITY',
    'PARTICLE_PHYSICS',
    'NUCLEAR_PHYSICS',
    'ASTROPHYSICS',
    'CONDENSED_MATTER',
    'STATISTICAL_PHYSICS',
    'GEOPHYSICS',
    'BIOPHYSICS',

    'ORGANIC_CHEMISTRY',
    'INORGANIC_CHEMISTRY',
    'PHYSICAL_CHEMISTRY',
    'ANALYTICAL_CHEMISTRY',
    'BIOCHEMISTRY',
    'POLYMER_CHEMISTRY',
    'SURFACE_CHEMISTRY',
    'ENVIRONMENTAL_CHEMISTRY',
    'INDUSTRIAL_CHEMISTRY',

    'MATERIAL_SCIENCE',
  ] as const;

  for (const name of domainNames) {
    await prisma.domain.upsert({
      where: { name },
      update: {},
      create: { name },
    });
  }

  console.log(`Seeded ${domainNames.length} domains.`);
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

Notez la méthode typique est upsert(), qui est la combinaison idempotent d'insert() et de update(). upsert() assurent que si le seed.ts est réexécuté (après une réinitialisation, etc.), aucun duplicat n'est crée.

Ex .

écution

npx prisma db seed

npx prisma migrate dev exécutera normalement seed.ts de manière automatique.