我开发的nextcrawler,使用 使用Playwright + Next.js + Prisma等主流技术搭建的网页数据采集器,项目已经开源: https://github.com/g089h515r806/nextcrawler
最初开发的时候,prisma还是6.x版本,最近发现prisma已经升级到了7.x版本,而且是主版本升级。决定将自己项目的prisma版本从6.x 升级到7.x,踩了不少坑。
当前使用的版本:
"@prisma/client": "^6.18.0",
"prisma": "^6.18.0",
开发的时候,这个版本已经比较高了,初步开发完了以后,出来了7.x版本,
准备升级,尝试了一下,不行,
参考了一下两篇文章:
https://www.prisma.io/docs/guides/upgrade-prisma-orm/v7
https://www.prisma.io/docs/prisma-orm/quickstart/mysql
一、升级程序
我用的数据库是mysql, 使用的npm
npm install @prisma/client@7
npm install -D prisma@7
npm install @prisma/adapter-mariadb
升级后的配置:
"@prisma/adapter-mariadb": "^7.4.0",
"@prisma/client": "^7.4.0",
"prisma": "^7.4.0",
二、修改程序、配置
schema.prisma里面:
generator client {
provider = "prisma-client-js"
}
修改为:
generator client {
provider = "prisma-client"
output = "./generated/prisma"
}
直接运行: npx prisma generate,报错
Error: Prisma schema validation - (get-config wasm)
Error code: P1012
error: The datasource property `url` is no longer supported in schema files. Move connection URLs for Migrate to `prisma.config.ts` and pass either `adapter` for a direct database connection or `accelerateUrl` for Accelerate to the `PrismaClient` constructor. See https://pris.ly/d/config-datasource and https://pris.ly/d/prisma7-client-config
--> prisma\schema.prisma:8
|
7 | provider = "mysql"
8 | url = env("DATABASE_URL")
|
Validation Error Count: 1
[Context: getConfig]
Prisma CLI Version : 7.4.0
创建prisma.config.js文件:
import { defineConfig, env } from 'prisma/config'
import 'dotenv/config'
export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DATABASE_URL'),
},
})
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
修改为:
datasource db {
provider = "mysql"
}
再次运行npx prisma generate,成功:
Loaded Prisma config from prisma.config.mjs.
Prisma schema loaded from prisma\schema.prisma.
✔ Generated Prisma Client (7.4.0) to .\prisma\generated\prisma in 116ms
修改.env文件,追加配置:
DATABASE_URL="mysql://root:123456@localhost:3306/nextcrawler1"
DATABASE_USER="root"
DATABASE_PASSWORD="123456"
DATABASE_NAME="nextcrawler1"
DATABASE_HOST="localhost"
DATABASE_PORT=3306
使用驱动程序适配器实例化 Prisma Client
修改 prisma实例化代码:
原来:
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export default prisma;
修改为:
import 'dotenv/config'
import { PrismaMariaDb } from '@prisma/adapter-mariadb'
import { PrismaClient } from '../prisma/generated/prisma/client'
const adapter = new PrismaMariaDb({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
connectionLimit: 5
})
const prisma = new PrismaClient({ adapter })
export default prisma;
三、将自动生成的prisma client ts代码,转为js版本
注意:
import { PrismaClient } from '../prisma/generated/prisma/client'
文件的路径需要设置正确, 此外,默认生成的是ts代码, 结果发现官方不支持js格式,
https://github.com/prisma/prisma/discussions/27596
https://github.com/prisma/prisma/issues/28116
需要安装:
pnpm add -D tsx tsup
https://www.npmjs.com/package/ts-node
解决方案:
1,升级nodejs的版本,最新版本直接支持ts,当然支持的不是特别全,大部分没问题
Update for people who will see this Node.js now officially supports TypeScript as of v25.2.0, so you do not need our implementation; you can just directly run the ts files from js files now. I have tested it and no complaints
2,完整ts支持,可以使用tsx
3,安装tsc,将ts文件编译成js文件, 我们没有使用enum,
npm add -D typescript
创建 tsconfig.prisma.json文件:
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Node",
"outDir": "./prisma/generated/prisma",
"rootDir": "./prisma/generated/prisma-ts",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
"strict": false,
"declaration": true,
"resolveJsonModule": true,
},
"include": ["./prisma/generated/prisma-ts"]
}
https://www.cnblogs.com/fighxp/p/7411376.html
设置系统环境变量, nodejs环境变量
npm install -g typescript
确保tsc命令可用,
tsc --project tsconfig.prisma.json
修改为:
generator client {
provider = "prisma-client"
output = "./generated/prisma-ts"
importFileExtension = "js"
}
npm run generateClient
pool timeout: failed to retrieve a connection from pool after 10008ms
(pool connections: active=0 idle=0 limit=5)
改为:
import 'dotenv/config'
import { PrismaMariaDb } from '@prisma/adapter-mariadb'
import { PrismaClient } from '../prisma/generated/prisma/client.js'
const adapter = new PrismaMariaDb({
host: process.env.DATABASE_HOST,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
ssl: false, // set true if using SSL
connectionLimit: 5
})
const prisma = new PrismaClient({ adapter })
export default prisma;
将ssl设置为false,即可连接数据库,
运行npm run dev,可以了,升级成功,

