fix(prisma): provider statique + scripts de bascule SQLite/PostgreSQL

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 <noreply@anthropic.com>
This commit is contained in:
Mathieu BOURBON
2026-04-18 16:38:03 +02:00
parent fbb6138c28
commit 73d016ec24
3 changed files with 44 additions and 5 deletions

View File

@@ -18,6 +18,8 @@
"db:studio": "prisma studio", "db:studio": "prisma studio",
"db:seed": "tsx prisma/seed.ts", "db:seed": "tsx prisma/seed.ts",
"db:reset": "prisma migrate reset", "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:up": "docker compose -f docker/docker-compose.yml up -d",
"docker:down": "docker compose -f docker/docker-compose.yml down", "docker:down": "docker compose -f docker/docker-compose.yml down",
"docker:logs": "docker compose -f docker/docker-compose.yml logs -f", "docker:logs": "docker compose -f docker/docker-compose.yml logs -f",

View File

@@ -1,9 +1,10 @@
// IPAM — Schéma Prisma // IPAM — Schéma Prisma
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Le `provider` est injecté via la variable d'environnement DATABASE_PROVIDER // Prisma n'accepte PAS `env()` pour le champ `provider` (seulement pour `url`).
// (SQLite par défaut, PostgreSQL en option). Les deux sont pris en charge. // Le provider par défaut est donc `sqlite`. Pour basculer vers PostgreSQL :
// Lors d'un changement de provider, régénérer le client : `pnpm db:generate` // npm run db:use-postgres
// et lancer une nouvelle migration : `pnpm db:migrate`. // 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 { generator client {
@@ -11,7 +12,7 @@ generator client {
} }
datasource db { datasource db {
provider = env("DATABASE_PROVIDER") provider = "sqlite"
url = env("DATABASE_URL") url = env("DATABASE_URL")
} }

View File

@@ -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 <sqlite|postgresql>');
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');