Prisma安装使用
可以。下面按你自己动手的顺序来,先做到db pull+generate成功,暂时不改业务代码。
前置条件(先确认)
- 本机 MySQL 已启动。
- 库名一般是
im_db(.env.dev里是DB_NAME=im_db)。 - 库里已有表(至少 admin 那几张;IM 表也在同一库没关系)。
终端自测:
mysql-uroot-p-e"USE im_db; SHOW TABLES;"能看到admin_users、users、chat_rooms等即可。
第一步:安装 Prisma
在项目根目录im-h5-backend:
npminstallprisma --save-devnpminstall@prisma/clientprisma:CLI(db pull、generate)@prisma/client:运行时客户端
第二步:初始化 Prisma
npx prisma init会生成:
prisma/ schema.prisma # 表结构定义 .env # 若已有,可能只追加 DATABASE_URL第三步:配置连哪个库(关键)
Prisma默认读项目根目录的.env,不是你们的.env.dev。
做法 A(推荐):根目录.env写DATABASE_URL
根据.env.dev里的账号,写成一行(把密码改成你的):
DATABASE_URL="mysql://root:你的密码@127.0.0.1:3306/im_db"格式:mysql://用户:密码@主机:端口/数据库名
做法 B:临时指定 env 文件
dotenv-e.env.dev -- npx prisma db pull(需先npm i -D dotenv-cli,不如 A 省事。)
打开prisma/schema.prisma,确认顶部类似:
generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") }「哪个库」=DATABASE_URL最后那段/im_db。
第四步:从数据库反推表结构(db pull)
确保 MySQL 可连、.env里DATABASE_URL正确,然后:
npx prisma db pull含义:
- 连接
im_db - 扫描该库下用户表(不是整个 MySQL 所有库)
- 把表结构写入
prisma/schema.prisma的model
成功后终端会提示 introspected 多少张表;打开prisma/schema.prisma应能看到大量model,例如:
model admin_users { id BigInt @id @default(autoincrement()) username String @unique password_hash String // ... } model users { // ... }这是预期现象
- IM + admin 表会一起被拉下来(同一库)。
- 表名可能是snake_case 的 model 名(如
admin_users),后面可慢慢改成AdminUser+@@map。 - 第一步不用改,先能
generate再说。
若报错
| 报错 | 处理 |
|---|---|
| Can’t reach database | 检查 MySQL、host/port |
| Access denied | 用户名密码 |
Unknown databaseim_db | 先建库或改 URL |
| Authentication plugin | MySQL 8 用户插件问题,查 MySQL 文档 |
第五步:检查schema.prisma(浏览即可)
db pull后建议看一眼:
datasource仍是mysql+env("DATABASE_URL")。- model 数量是否和
SHOW TABLES差不多。 - 关系(
@relation)Prisma 可能自动猜,错的以后改。
此阶段不必删 IM 的 model,也不必马上改 admin service。
第六步:生成客户端(generate)
npx prisma generate含义:
- 读
prisma/schema.prisma里每一个model - 在
node_modules/.prisma/client生成 TS 类型和PrismaClient
成功会看到类似:Generated Prisma Client ...
和db pull的区别
| 命令 | 作用 |
|---|---|
db pull | 数据库 → 写入schema.prisma |
generate | schema.prisma→ 生成@prisma/client代码 |
以后:改表结构→ 再pull或手改 schema → 再generate。
第七步:验证是否生成成功(可选小脚本)
在项目根新建临时文件scripts/test-prisma.ts(测完可删):
import{PrismaClient}from'@prisma/client'constprisma=newPrismaClient()asyncfunctionmain(){// model 名以你 pull 后的 schema 为准,可能是 admin_users 或 AdminUserconstcount=awaitprisma.admin_users.count()console.log('admin_users count:',count)}main().catch(console.error).finally(()=>prisma.$disconnect())运行:
npx tsx scripts/test-prisma.ts能打出数字说明:连库 + pull + generate整条链路通了。
若 TS 报错Property 'admin_users' does not exist,打开schema.prisma看实际 model 名(admin_users还是AdminUser),和代码保持一致。
第八步:建议在package.json加的脚本(方便以后)
"prisma:pull":"prisma db pull","prisma:generate":"prisma generate","postinstall":"prisma generate"postinstall可选;团队协作时有用,你一个人可以先不加。
第九步:和现有pool的关系(现在不用动)
现在: services/admin/* → 继续 mysql2 pool(不变) services/im/* → 继续 pool(不变) 以后: 新建 src/lib/prisma.ts → export prisma 逐个把 admin service 改成 prisma.xxx做完 pull + generate 不会自动替换现有 SQL,只是准备好了工具。
推荐操作顺序( checklist )
□ npm install prisma @prisma/client □ npx prisma init □ 根目录 .env 配置 DATABASE_URL → im_db □ npx prisma db pull □ 打开 prisma/schema.prisma 确认有 admin_users 等 □ npx prisma generate □ npx tsx scripts/test-prisma.ts 测 count只做 admin 时,schema 要删 IM 表吗?
不用。db pull拉全库即可;IM 的 model 留在 schema 里不影响,只是generate会多生成一些类型,不用就没开销习惯问题。
以后迁 IM 时反而省事。
以后每次改表怎么走
| 场景 | 做法 |
|---|---|
| 别人改了 MySQL 表 | npx prisma db pull→npx prisma generate |
| 你用 migrate 改表 | 改 schema →npx prisma migrate dev→ 自动 generate |
| 只改了 schema 手填 | npx prisma generate |
你们现阶段用pull对齐现有库即可,migrate 可以 admin 稳定后再上。
下一步(pull/generate 成功之后)
- 建
src/lib/prisma.ts(单例PrismaClient)。 - 只改一个最简单的:
admin-settings.service.ts或admin-auth.service.ts。 - 再迁其余 admin service。
你如果愿意,做完第四步或第六步后把prisma/schema.prisma前几行或报错贴出来,我可以帮你看 model 名、该怎么写第一条prisma.xxx查询(仍可在 Ask 模式)。
