Prisma安装使用

可以。下面按你自己动手的顺序来,先做到db pull+generate成功,暂时不改业务代码


前置条件(先确认)

  1. 本机 MySQL 已启动。
  2. 库名一般是im_db.env.dev里是DB_NAME=im_db)。
  3. 库里已有表(至少 admin 那几张;IM 表也在同一库没关系)。

终端自测:

mysql-uroot-p-e"USE im_db; SHOW TABLES;"

能看到admin_usersuserschat_rooms等即可。


第一步:安装 Prisma

在项目根目录im-h5-backend

npminstallprisma --save-devnpminstall@prisma/client
  • prisma:CLI(db pullgenerate
  • @prisma/client:运行时客户端

第二步:初始化 Prisma

npx prisma init

会生成:

prisma/ schema.prisma # 表结构定义 .env # 若已有,可能只追加 DATABASE_URL

第三步:配置连哪个库(关键)

Prisma默认读项目根目录的.env,不是你们的.env.dev

做法 A(推荐):根目录.envDATABASE_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 可连、.envDATABASE_URL正确,然后:

npx prisma db pull

含义:

  • 连接im_db
  • 扫描该库下用户表(不是整个 MySQL 所有库)
  • 把表结构写入prisma/schema.prismamodel

成功后终端会提示 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 pluginMySQL 8 用户插件问题,查 MySQL 文档

第五步:检查schema.prisma(浏览即可)

db pull后建议看一眼:

  1. datasource仍是mysql+env("DATABASE_URL")
  2. model 数量是否和SHOW TABLES差不多。
  3. 关系@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
generateschema.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 pullnpx prisma generate
你用 migrate 改表改 schema →npx prisma migrate dev→ 自动 generate
只改了 schema 手填npx prisma generate

你们现阶段用pull对齐现有库即可,migrate 可以 admin 稳定后再上。


下一步(pull/generate 成功之后)

  1. src/lib/prisma.ts(单例PrismaClient)。
  2. 只改一个最简单的:admin-settings.service.tsadmin-auth.service.ts
  3. 再迁其余 admin service。

你如果愿意,做完第四步或第六步后prisma/schema.prisma前几行或报错贴出来,我可以帮你看 model 名、该怎么写第一条prisma.xxx查询(仍可在 Ask 模式)。