fix: migrate to Prisma 7 driver adapter (libsql) for SQLite #2

Merged
jason merged 1 commits from claude/reverent-proskuriakova into master 2026-03-12 23:51:13 -05:00
5 changed files with 20 additions and 10 deletions

View File

@@ -17,7 +17,6 @@ COPY . .
# Generate Prisma Client (with SQLite) # Generate Prisma Client (with SQLite)
ENV DATABASE_URL="file:/app/data/dev.db" ENV DATABASE_URL="file:/app/data/dev.db"
ENV PRISMA_CLIENT_ENGINE_TYPE=library
RUN npx prisma generate RUN npx prisma generate
# Disable telemetry during build # Disable telemetry during build
@@ -32,7 +31,6 @@ WORKDIR /app
ENV NODE_ENV=production ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_TELEMETRY_DISABLED=1
ENV DATABASE_URL="file:/app/data/dev.db" ENV DATABASE_URL="file:/app/data/dev.db"
ENV PRISMA_CLIENT_ENGINE_TYPE=library
RUN addgroup --system --gid 1001 nodejs RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs RUN adduser --system --uid 1001 nextjs

View File

@@ -9,7 +9,9 @@
"lint": "eslint" "lint": "eslint"
}, },
"dependencies": { "dependencies": {
"@libsql/client": "^0.14.0",
"@next-auth/prisma-adapter": "^1.0.7", "@next-auth/prisma-adapter": "^1.0.7",
"@prisma/adapter-libsql": "^7.5.0",
"@prisma/client": "^7.5.0", "@prisma/client": "^7.5.0",
"googleapis": "^171.4.0", "googleapis": "^171.4.0",
"lucide-react": "^0.577.0", "lucide-react": "^0.577.0",

View File

@@ -1,9 +1,16 @@
import "dotenv/config"; 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({ export default defineConfig({
schema: "prisma/schema.prisma", schema: "prisma/schema.prisma",
datasource: { migrate: {
url: env("DATABASE_URL") || "file:./dev.db", adapter: async () => {
const libsql = createClient({
url: process.env.DATABASE_URL ?? "file:./dev.db",
});
return new PrismaLibSQL(libsql);
},
}, },
}); });

View File

@@ -2,13 +2,11 @@
// learn more about it in the docs: https://pris.ly/d/prisma-schema // learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client { generator client {
provider = "prisma-client-js" provider = "prisma-client-js"
engineType = "library"
} }
datasource db { datasource db {
provider = "sqlite" provider = "sqlite"
url = env("DATABASE_URL")
} }
model Account { model Account {

View File

@@ -1,4 +1,6 @@
import { PrismaClient } from '@prisma/client' import { PrismaClient } from '@prisma/client'
import { PrismaLibSQL } from '@prisma/adapter-libsql'
import { createClient } from '@libsql/client'
const globalForPrisma = globalThis as unknown as { const globalForPrisma = globalThis as unknown as {
prisma: PrismaClient | undefined prisma: PrismaClient | undefined
@@ -6,7 +8,12 @@ const globalForPrisma = globalThis as unknown as {
function getPrismaClient(): PrismaClient { function getPrismaClient(): PrismaClient {
if (!globalForPrisma.prisma) { if (!globalForPrisma.prisma) {
const libsql = createClient({
url: process.env.DATABASE_URL ?? 'file:./dev.db',
})
const adapter = new PrismaLibSQL(libsql)
globalForPrisma.prisma = new PrismaClient({ globalForPrisma.prisma = new PrismaClient({
adapter,
log: process.env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'], 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 // Use a Proxy so `new PrismaClient()` is only called when a property
// is first accessed (inside a request handler), NOT at module import time. // 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, { export const prisma = new Proxy({} as PrismaClient, {
get(_target, prop) { get(_target, prop) {
return Reflect.get(getPrismaClient(), prop) return Reflect.get(getPrismaClient(), prop)