You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js部署Vercel后Prisma连接SQLite数据库失败求助

问题描述

在Next.js应用访问加载数据的页面时出现504内部服务器错误,错误类型为PrismaClientInitializationError,调用prisma.job.findMany()失败,提示无法打开SQLite数据库文件。本地环境运行正常,但部署到Vercel后触发该问题。

Vercel日志完整错误信息:

Error retrieving users: PrismaClientInitializationError: 
Invalid `prisma.job.findMany()` invocation:


Error querying the database: unable to open database file: /var/task/node_modules/.prisma/client/../database/invensisdb.db
    at An.handleRequestError (/var/task/node_modules/@prisma/client/runtime/library.js:174:7205)
    at An.handleAndLogRequestError (/var/task/node_modules/@prisma/client/runtime/library.js:174:6358)
    at /var/task/node_modules/@prisma/client/runtime/library.js:177:2908
    at async /var/task/node_modules/@prisma/client/runtime/library.js:177:3123
    at async t._executeRequest (/var/task/node_modules/@prisma/client/runtime/library.js:177:10621)
    at async Careers (/var/task/.next/server/pages/api/careers/post_get.js:64:25) {
  clientVersion: '4.15.0',
  errorCode: undefined
}

本地Prisma Schema配置:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = "file:../database/invensisdb.db"
}


model User {
  id        Int     @id @default(autoincrement())
  username     String  @unique
  password     String 
  createdAt DateTime @default(now())
}

model Job {
  id        Int     @id @default(autoincrement())
  location  String
  title     String
  description   String
  createdAt DateTime @default(now())
}

model JobApplication {
  id        Int     @id @default(autoincrement())
  email      String
  location   String
  startDate  String
  primarySkills  String
  createdAt DateTime @default(now())
}

model Projects {
  id        Int     @id @default(autoincrement())
  name     String
  location      String
  description     String
  duration     String
  createdAt DateTime @default(now())
}

项目文件夹结构截图

解决方案

1. 修复数据库路径配置

问题核心是Vercel部署后,Prisma Client运行时的目录结构与本地不同,相对路径无法定位到数据库文件。调整为基于项目根目录的路径:

  • 修改prisma/schema.prisma中的数据源配置,改用环境变量:
datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}
  • 在项目根目录创建(或修改).env文件,添加:
DATABASE_URL="file:./database/invensisdb.db"

该路径基于项目根目录,无论本地还是Vercel部署环境都能正确定位到数据库文件。

2. 确保数据库文件被纳入部署包

  • 检查项目根目录的.gitignore文件,确认没有忽略database/invensisdb.db,若存在忽略规则则删除。
  • 执行以下命令将数据库文件加入Git追踪并推送:
git add database/invensisdb.db
git commit -m "Add SQLite database file"
git push

3. 验证Vercel构建命令

确保Vercel构建时执行了Prisma Client生成步骤,修改package.json的scripts:

"scripts": {
  "build": "prisma generate && next build",
  "dev": "prisma generate && next dev",
  ...
}

这样部署时会重新生成适配环境的Prisma Client,避免路径问题。

4. 长期方案:替换为托管数据库(可选)

SQLite在Vercel的无服务器函数环境中存在局限性:文件系统临时且只读(仅/tmp目录可写),无法支持数据写入操作。如果应用需要写入数据,建议改用Vercel Postgres、Supabase等托管数据库服务,适配无服务器架构。


内容的提问来源于stack exchange,提问作者Micode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:10:39