From 73d016ec24d938c3b7376dd0325a977ba5bb9989 Mon Sep 17 00:00:00 2001 From: Mathieu BOURBON Date: Sat, 18 Apr 2026 16:38:03 +0200 Subject: [PATCH] fix(prisma): provider statique + scripts de bascule SQLite/PostgreSQL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prisma ne supporte pas env() pour le champ `provider` d'un datasource (uniquement pour `url`). Le schéma utilise maintenant `provider = "sqlite"` en statique, et deux scripts npm (`db:use-sqlite` / `db:use-postgres`) réécrivent le fichier pour basculer entre les deux moteurs. Sans ce fix, `prisma generate` échoue au boot. Co-Authored-By: Claude Opus 4.7 --- package.json | 2 ++ prisma/schema.prisma | 11 ++++++----- scripts/switch-db-provider.mjs | 36 ++++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 scripts/switch-db-provider.mjs diff --git a/package.json b/package.json index 7609b24..1f5d68c 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,8 @@ "db:studio": "prisma studio", "db:seed": "tsx prisma/seed.ts", "db:reset": "prisma migrate reset", + "db:use-sqlite": "node scripts/switch-db-provider.mjs sqlite", + "db:use-postgres": "node scripts/switch-db-provider.mjs postgresql", "docker:up": "docker compose -f docker/docker-compose.yml up -d", "docker:down": "docker compose -f docker/docker-compose.yml down", "docker:logs": "docker compose -f docker/docker-compose.yml logs -f", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index f323da1..0199ed5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,9 +1,10 @@ // IPAM — Schéma Prisma // --------------------------------------------------------------------- -// Le `provider` est injecté via la variable d'environnement DATABASE_PROVIDER -// (SQLite par défaut, PostgreSQL en option). Les deux sont pris en charge. -// Lors d'un changement de provider, régénérer le client : `pnpm db:generate` -// et lancer une nouvelle migration : `pnpm db:migrate`. +// Prisma n'accepte PAS `env()` pour le champ `provider` (seulement pour `url`). +// Le provider par défaut est donc `sqlite`. Pour basculer vers PostgreSQL : +// npm run db:use-postgres +// puis régénérer le client : `npm run db:generate` et migrer : `npm run db:migrate`. +// Pour revenir à SQLite : `npm run db:use-sqlite`. // --------------------------------------------------------------------- generator client { @@ -11,7 +12,7 @@ generator client { } datasource db { - provider = env("DATABASE_PROVIDER") + provider = "sqlite" url = env("DATABASE_URL") } diff --git a/scripts/switch-db-provider.mjs b/scripts/switch-db-provider.mjs new file mode 100644 index 0000000..17b8ed7 --- /dev/null +++ b/scripts/switch-db-provider.mjs @@ -0,0 +1,36 @@ +#!/usr/bin/env node +/** + * Bascule le provider Prisma entre SQLite et PostgreSQL. + * Prisma n'accepte pas env() pour `provider`, donc on réécrit le fichier. + * + * Usage : node scripts/switch-db-provider.mjs sqlite + * node scripts/switch-db-provider.mjs postgresql + */ +import { readFileSync, writeFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const schemaPath = resolve(__dirname, '..', 'prisma', 'schema.prisma'); + +const target = process.argv[2]; +if (!['sqlite', 'postgresql'].includes(target)) { + console.error('Usage : node scripts/switch-db-provider.mjs '); + process.exit(1); +} + +const content = readFileSync(schemaPath, 'utf8'); +const next = content.replace( + /provider\s*=\s*"(sqlite|postgresql)"/, + `provider = "${target}"`, +); + +if (next === content) { + console.log(`Provider déjà réglé sur "${target}", rien à faire.`); + process.exit(0); +} + +writeFileSync(schemaPath, next); +console.log(`✅ Provider Prisma basculé sur "${target}"`); +console.log(' Pense à adapter DATABASE_URL dans .env puis :'); +console.log(' npm run db:generate && npm run db:migrate');