mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-24 13:54:57 +00:00
MAJOR FIX: Correct Prisma 7 adapter usage - use factory pattern with URL config
The root cause was incorrect adapter usage:
- PrismaBetterSqlite3 is a FACTORY that expects {url: string} config
- We were incorrectly passing a Database instance directly
- This caused "Cannot read properties of undefined (reading 'replace')" error
Changes:
1. Fixed Next.js prisma.ts to pass {url} config to adapter factory
2. Fixed DBAL context.ts to use adapter factory with URL
3. Removed direct Database instantiation - let adapter handle it
4. Created absolute-path .env file with DATABASE_URL
5. Cleaned and reinstalled all dependencies to ensure version alignment
6. Added missing database columns (tenantId, config to InstalledPackage)
Result: Database operations now work! Application serves pages successfully.
Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com>
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
|
||||
import Database from 'better-sqlite3'
|
||||
import { PrismaAdapterDialect, type PrismaAdapterOptions, type PrismaContext } from './types'
|
||||
|
||||
export function createPrismaContext(
|
||||
@@ -8,7 +7,7 @@ export function createPrismaContext(
|
||||
options?: PrismaAdapterOptions
|
||||
): PrismaContext {
|
||||
console.log('[DBAL Prisma] Creating Prisma context')
|
||||
console.log('[DBAL Prisma] Database URL:', databaseUrl)
|
||||
console.log('[DBAL Prisma] Database URL parameter:', databaseUrl)
|
||||
console.log('[DBAL Prisma] Options:', options)
|
||||
|
||||
const inferredDialect = options?.dialect ?? inferDialectFromUrl(databaseUrl)
|
||||
@@ -18,16 +17,19 @@ export function createPrismaContext(
|
||||
|
||||
// For SQLite (or when dialect cannot be inferred), we need to use the driver adapter
|
||||
if (inferredDialect === 'sqlite' || !databaseUrl || inferredDialect === undefined) {
|
||||
const dbPath = databaseUrl?.replace('file:', '').replace('sqlite://', '') || '../../prisma/prisma/dev.db'
|
||||
console.log('[DBAL Prisma] Using SQLite with path:', dbPath)
|
||||
// Use absolute path as fallback to avoid path resolution issues
|
||||
const fallbackUrl = 'file:/home/runner/work/metabuilder/metabuilder/prisma/prisma/dev.db'
|
||||
const finalUrl = databaseUrl || fallbackUrl
|
||||
|
||||
// Ensure URL has file: prefix for SQLite
|
||||
const sqliteUrl = finalUrl.startsWith('file:') ? finalUrl : `file:${finalUrl}`
|
||||
|
||||
console.log('[DBAL Prisma] Using SQLite URL:', sqliteUrl)
|
||||
|
||||
try {
|
||||
const db = new Database(dbPath)
|
||||
console.log('[DBAL Prisma] Database opened successfully')
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
const adapter = new PrismaBetterSqlite3(db)
|
||||
console.log('[DBAL Prisma] Adapter created successfully')
|
||||
// PrismaBetterSqlite3 is a factory that expects { url: string } config
|
||||
const adapter = new PrismaBetterSqlite3({ url: sqliteUrl })
|
||||
console.log('[DBAL Prisma] Adapter factory created successfully')
|
||||
|
||||
prisma = new PrismaClient({ adapter } as any)
|
||||
console.log('[DBAL Prisma] PrismaClient created successfully')
|
||||
|
||||
9368
frontends/nextjs/package-lock.json
generated
9368
frontends/nextjs/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,11 +9,9 @@
|
||||
// these assignments/calls are safe for runtime but look unsafe to the linter.
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'
|
||||
import Database from 'better-sqlite3'
|
||||
|
||||
const globalForPrisma = globalThis as unknown as {
|
||||
prisma: PrismaClient | undefined
|
||||
prismaTestDb: Database | undefined
|
||||
}
|
||||
|
||||
const isTestEnv = process.env.NODE_ENV === 'test' || process.env.VITEST === 'true'
|
||||
@@ -37,31 +35,28 @@ const createMockPrisma = (): PrismaClient => {
|
||||
}
|
||||
|
||||
const createIntegrationPrisma = (): PrismaClient => {
|
||||
if (globalForPrisma.prismaTestDb === undefined) {
|
||||
globalForPrisma.prismaTestDb = new Database(':memory:')
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
const adapter = new PrismaBetterSqlite3(globalForPrisma.prismaTestDb)
|
||||
// For integration tests, use in-memory database via adapter factory
|
||||
const adapter = new PrismaBetterSqlite3({ url: ':memory:' })
|
||||
return new PrismaClient({ adapter })
|
||||
}
|
||||
|
||||
const createProductionPrisma = (): PrismaClient => {
|
||||
// Use the database file from env or default location
|
||||
const databaseUrl = process.env.DATABASE_URL || 'file:../../prisma/prisma/dev.db'
|
||||
// CRITICAL: Validate DATABASE_URL is set and properly formatted
|
||||
const databaseUrl = process.env.DATABASE_URL || 'file:/home/runner/work/metabuilder/metabuilder/prisma/prisma/dev.db'
|
||||
|
||||
console.log('[Prisma] Creating production Prisma client')
|
||||
console.log('[Prisma] DATABASE_URL:', process.env.DATABASE_URL)
|
||||
console.log('[Prisma] DATABASE_URL from env:', process.env.DATABASE_URL)
|
||||
console.log('[Prisma] Using database URL:', databaseUrl)
|
||||
|
||||
const dbPath = databaseUrl.replace('file:', '')
|
||||
console.log('[Prisma] Resolved database path:', dbPath)
|
||||
// Validate URL format for SQLite
|
||||
if (!databaseUrl.startsWith('file:')) {
|
||||
throw new Error(`[Prisma] Invalid DATABASE_URL format: "${databaseUrl}". SQLite requires "file:" prefix.`)
|
||||
}
|
||||
|
||||
try {
|
||||
const db = new Database(dbPath)
|
||||
console.log('[Prisma] Database connection opened successfully')
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
const adapter = new PrismaBetterSqlite3(db)
|
||||
console.log('[Prisma] Adapter created successfully')
|
||||
// For Prisma 7, PrismaBetterSqlite3 is a FACTORY that takes config with url, not a client instance
|
||||
const adapter = new PrismaBetterSqlite3({ url: databaseUrl })
|
||||
console.log('[Prisma] Adapter factory created successfully')
|
||||
|
||||
const client = new PrismaClient({
|
||||
adapter,
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user