From fcc04915c23829f6395d906ee35f675407384ecc Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 12 Mar 2026 23:49:58 -0500 Subject: [PATCH] fix: migrate to Prisma 7 driver adapter (libsql) for SQLite Prisma 7 removed support for `url` in schema.prisma datasources and the `engineType = "library"` native binary engine. All connections now go through a driver adapter. - Remove engineType and url from schema.prisma (no longer supported) - Configure prisma.config.ts with migrate.adapter using @libsql/client - Instantiate PrismaClient with PrismaLibSQL adapter in src/lib/prisma.ts - Add @libsql/client and @prisma/adapter-libsql dependencies - Remove PRISMA_CLIENT_ENGINE_TYPE from Dockerfile (obsolete) Co-Authored-By: Claude Sonnet 4.6 --- Dockerfile | 2 -- package.json | 2 ++ prisma.config.ts | 13 ++++++++++--- prisma/schema.prisma | 4 +--- src/lib/prisma.ts | 9 +++++++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index fa29513..b07cd46 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,6 @@ COPY . . # Generate Prisma Client (with SQLite) ENV DATABASE_URL="file:/app/data/dev.db" -ENV PRISMA_CLIENT_ENGINE_TYPE=library RUN npx prisma generate # Disable telemetry during build @@ -32,7 +31,6 @@ WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV DATABASE_URL="file:/app/data/dev.db" -ENV PRISMA_CLIENT_ENGINE_TYPE=library RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs diff --git a/package.json b/package.json index b2f4235..de9e790 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ "lint": "eslint" }, "dependencies": { + "@libsql/client": "^0.14.0", "@next-auth/prisma-adapter": "^1.0.7", + "@prisma/adapter-libsql": "^7.5.0", "@prisma/client": "^7.5.0", "googleapis": "^171.4.0", "lucide-react": "^0.577.0", diff --git a/prisma.config.ts b/prisma.config.ts index d56a796..9d6d6bf 100644 --- a/prisma.config.ts +++ b/prisma.config.ts @@ -1,9 +1,16 @@ import "dotenv/config"; -import { defineConfig, env } from "prisma/config"; +import { defineConfig } from "prisma/config"; +import { createClient } from "@libsql/client"; +import { PrismaLibSQL } from "@prisma/adapter-libsql"; export default defineConfig({ schema: "prisma/schema.prisma", - datasource: { - url: env("DATABASE_URL") || "file:./dev.db", + migrate: { + adapter: async () => { + const libsql = createClient({ + url: process.env.DATABASE_URL ?? "file:./dev.db", + }); + return new PrismaLibSQL(libsql); + }, }, }); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2e8b9e3..f56fe04 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -2,13 +2,11 @@ // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { - provider = "prisma-client-js" - engineType = "library" + provider = "prisma-client-js" } datasource db { provider = "sqlite" - url = env("DATABASE_URL") } model Account { diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index ab9360b..1cca3b9 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -1,4 +1,6 @@ import { PrismaClient } from '@prisma/client' +import { PrismaLibSQL } from '@prisma/adapter-libsql' +import { createClient } from '@libsql/client' const globalForPrisma = globalThis as unknown as { prisma: PrismaClient | undefined @@ -6,7 +8,12 @@ const globalForPrisma = globalThis as unknown as { function getPrismaClient(): PrismaClient { if (!globalForPrisma.prisma) { + const libsql = createClient({ + url: process.env.DATABASE_URL ?? 'file:./dev.db', + }) + const adapter = new PrismaLibSQL(libsql) globalForPrisma.prisma = new PrismaClient({ + adapter, log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], }) } @@ -15,8 +22,6 @@ function getPrismaClient(): PrismaClient { // Use a Proxy so `new PrismaClient()` is only called when a property // is first accessed (inside a request handler), NOT at module import time. -// This prevents PrismaClientConstructorValidationError during Next.js -// static analysis / "Collecting page data" phase. export const prisma = new Proxy({} as PrismaClient, { get(_target, prop) { return Reflect.get(getPrismaClient(), prop)