Prisma 7 版本 ORM 使用指南由于是自学的prisma网上关于prisma的资料很多是旧版本的所以在此记录一下最新7版本的操作方便以后查阅Prisma 简介Prisma 是一个现代的 TypeScript-first ORM对象关系映射工具具有以下特点-类型安全自动生成 TypeScript 类型类型安全的查询编译时检查查询错误直观的 API简洁易读的查询语法数据库迁移强大的迁移管理工具Prisma Studio可视化数据库管理工具初始化项目npminit-y# 安装 TypeScript 和 tsxpnpminstalltypescript tsx types/node --save-dev# 初始化 TypeScript的 tsconfig.json 配置pnpmdlx tsc--init安装所需依赖# 安装 Prisma CLI 工具pnpmaddprisma --save-dev# 安装 Prisma Client 和 MariaDB 适配器pnpmaddprisma/client prisma/adapter-mariadb dotenvprisma/client - 用于查询数据库的 Prisma 客户端库prisma/adapter-mariadb - 连接 Prisma 客户端与数据库的 MySQL/MariaDB 驱动程序适配器dotenv - 从你的 .env 文件加载环境变量配置ESM支持在tsconfig.json中添加以下配置以支持 ESM{compilerOptions:{module:ESNext,moduleResolution:bundler,target:ES2023,strict:true,esModuleInterop:true,ignoreDeprecations:6.0}}设置package.json启用ESM{type:module}初始化 Prisma ORM# 初始化 Prisma 项目# pnpm dlx prisma# 初始化 Prisma 项目配置pnpmdlx prisma init --datasource-provider mysql--output../generated/prisma初始化完毕后会进行一下操作创建一个 prisma/ 目录里面有一个包含数据库连接和模式模型的 schema.prisma 文件在根目录中为环境变量创建 .env 文件为prisma 配置创建 prisma.config.ts 文件环境变量配置在.env文件中配置数据库连接DATABASE_URLmysql://root:1234localhost:3306/test DATABASE_USERroot DATABASE_PASSWORD1234 DATABASE_NAMEtest DATABASE_HOSTlocalhost DATABASE_PORT3306连接字符串格式mysql://用户名:密码主机:端口/数据库名Prisma Schema 配置schema.prisma 文件结构// 生成器配置 - 定义 Prisma Client 的生成方式 generator client { provider prisma-client output ../generated/prisma } // 数据源配置 - 定义数据库连接 datasource db { provider mysql url env(DATABASE_URL) // 从环境变量读取 } // 数据模型定义 model User { id Int id default(autoincrement()) name String db.VarChar(255) email String db.VarChar(255) age Int? db.Int posts Post[] } model Post { id Int id default(autoincrement()) title String db.VarChar(255) content String? db.Text author User relation(fields: [authorId], references: [id]) authorId Int db.Int }核心配置说明Generator生成器provider: 指定生成的客户端类型prisma-client- 标准 JavaScript/TypeScript 客户端prisma-client-js- 旧版客户端不推荐output: 指定生成代码的输出路径Datasource数据源provider: 数据库类型mysql- MySQL/MariaDBpostgresql- PostgreSQLsqlite- SQLitesqlserver- SQL Servermongodb- MongoDBurl: 数据库连接字符串支持从环境变量读取数据模型定义基本字段类型model User { id Int id default(autoincrement()) // 整数主键自增 name String db.VarChar(255) // 字符串最大255字符 email String db.VarChar(255) // 字符串最大255字符 age Int? db.Int // 可选整数 content String? db.Text // 可选文本 createdAt DateTime default(now()) // 默认当前时间 updatedAt DateTime updatedAt // 自动更新时间 }常用字段修饰符修饰符说明示例id主键id Int iddefault()默认值name String default(unknown)default(autoincrement())自增id Int id default(autoincrement())default(now())当前时间createdAt DateTime default(now())updatedAt自动更新时间updatedAt DateTime updatedAt?可选字段age Int?unique唯一约束email String uniquedb.VarChar(n)指定数据库类型name String db.VarChar(255)关系定义一对多关系model User { id Int id default(autoincrement()) posts Post[] // 一个用户可以有多篇文章 } model Post { id Int id default(autoincrement()) author User relation(fields: [authorId], references: [id]) authorId Int db.Int }一对一关系model User { id Int id default(autoincrement()) profile Profile? // 一个用户有一个资料 } model Profile { id Int id default(autoincrement()) user User relation(fields: [userId], references: [id]) userId Int unique db.Int }数据库迁移初始化迁移# 创建初始迁移npx prisma migrate dev--nameinit添加新迁移# 1. 修改 schema.prisma 文件# 2. 创建迁移npx prisma migrate dev--nameadd_new_field迁移命令命令说明npx prisma migrate dev开发环境迁移创建并应用迁移npx prisma migrate deploy生产环境部署迁移npx prisma migrate reset重置数据库并应用所有迁移npx prisma migrate status查看迁移状态npx prisma migrate resolve解决迁移问题迁移文件结构迁移文件位于prisma/migrations/目录下每个迁移包含migrations/ └── 20260306072824_init/ ├── migration.sql # 迁移的 SQL 语句 └── migration_lock.toml # 迁移锁定文件Prisma Client 使用初始化 Prisma Client项目中已配置在lib/prisma.ts中importdotenv/configimport{PrismaMariaDb}fromprisma/adapter-mariadbimport{PrismaClient}from../generated/prisma/clientconstadapternewPrismaMariaDb({host:process.env.DATABASE_HOST,user:process.env.DATABASE_USER,password:process.env.DATABASE_PASSWORD,database:process.env.DATABASE_NAME,connectionLimit:5,})constprismanewPrismaClient({adapter})export{prisma}基本 CRUD 操作创建数据Create// 创建单个用户constuserawaitprisma.user.create({data:{name:张三,email:zhangsanexample.com,age:25}})// 创建带关系的数据constpostawaitprisma.post.create({data:{title:我的第一篇文章,content:文章内容,author:{connect:{id:1}// 连接到已存在的用户}}})读取数据Read// 查询所有用户constusersawaitprisma.user.findMany()// 条件查询constusersawaitprisma.user.findMany({where:{age:{gte:18},// 年龄 18name:{contains:张}// 名字包含张},orderBy:{createdAt:desc// 按创建时间降序},skip:0,// 跳过多少条take:10,// 取多少条select:{id:true,name:true,email:true}})// 查询单个用户constuserawaitprisma.user.findUnique({where:{id:1}})// 查询关联数据constuserawaitprisma.user.findUnique({where:{id:1},include:{posts:true// 包含用户的文章}})更新数据Update// 更新单个用户constuserawaitprisma.user.update({where:{id:1},data:{name:李四,age:30}})// 更新多个用户constresultawaitprisma.user.updateMany({where:{age:{lt:18}},data:{age:18}})// 替换数据不推荐constuserawaitprisma.user.upsert({where:{id:1},update:{name:王五},create:{name:王五,email:wangwuexample.com}})删除数据Delete// 删除单个用户constuserawaitprisma.user.delete({where:{id:1}})// 删除多个用户constresultawaitprisma.user.deleteMany({where:{age:{lt:18}}})高级查询关系查询// 查询用户及其文章constuserawaitprisma.user.findUnique({where:{id:1},include:{posts:{orderBy:{createdAt:desc},take:10}}})// 查询文章及其作者constpostawaitprisma.post.findUnique({where:{id:1},include:{author:true}})条件过滤// 数值比较constusersawaitprisma.user.findMany({where:{age:{gte:18,lt:60}// 18 age 60}})// 字符串匹配constusersawaitprisma.user.findMany({where:{name:{startsWith:张},// 以张开头email:{contains:example.com}// 包含example.com}})// 逻辑运算constusersawaitprisma.user.findMany({where:{OR:[{age:{gte:60}},{age:{lt:18}}]}})聚合查询// 统计用户数量constcountawaitprisma.user.count()// 统计不同年龄段的用户数量constresultawaitprisma.user.groupBy({by:[age],_count:true})// 计算平均值constresultawaitprisma.user.aggregate({_avg:{age:true}})实际应用示例用户管理 APIimport{prisma}from../lib/prisma// 获取用户列表app.get(/api/users,async(req,res){constusersawaitprisma.user.findMany({orderBy:{createdAt:desc}})res.json({data:users})})// 创建用户app.post(/api/users,async(req,res){const{name,email,age}req.bodytry{constuserawaitprisma.user.create({data:{name,email,age}})res.json({data:user})}catch(error){res.status(400).json({error:创建用户失败})}})// 更新用户app.put(/api/users/:id,async(req,res){const{id}req.paramsconst{name,email,age}req.bodytry{constuserawaitprisma.user.update({where:{id:Number(id)},data:{name,email,age}})res.json({data:user})}catch(error){res.status(404).json({error:用户不存在})}})// 删除用户app.delete(/api/users/:id,async(req,res){const{id}req.paramstry{awaitprisma.user.delete({where:{id:Number(id)}})res.json({message:删除成功})}catch(error){res.status(404).json({error:用户不存在})}})文章管理 API// 创建文章app.post(/api/posts,async(req,res){const{title,content,authorId}req.bodytry{constpostawaitprisma.post.create({data:{title,content,author:{connect:{id:authorId}}}})res.json({data:post})}catch(error){res.status(400).json({error:创建文章失败})}})// 获取用户的所有文章app.get(/api/users/:id/posts,async(req,res){const{id}req.paramstry{constuserawaitprisma.user.findUnique({where:{id:Number(id)},include:{posts:true}})if(!user){returnres.status(404).json({error:用户不存在})}res.json({data:user.posts})}catch(error){res.status(500).json({error:获取文章失败})}})Prisma StudioPrisma Studio 是一个可视化数据库管理工具# 启动 Prisma Studionpx prisma studio# 访问 http://localhost:5555 查看数据库常见问题1. 生成 Prisma Client每次修改schema.prisma后需要重新生成客户端npx prisma generate2. 连接数据库失败检查以下几点数据库服务是否启动.env文件中的连接字符串是否正确数据库用户是否有足够的权限3. 迁移冲突如果遇到迁移冲突# 解决迁移问题npx prisma migrate resolve# 或者重置数据库npx prisma migrate reset4. 类型错误确保在tsconfig.json中正确配置{compilerOptions:{module:ESNext,moduleResolution:bundler,target:ES2023,strict:true,esModuleInterop:true}}最佳实践始终在事务中执行多个相关操作awaitprisma.$transaction([prisma.user.create({data:{...}}),prisma.post.create({data:{...}})])使用 select 限制返回字段constusersawaitprisma.user.findMany({select:{id:true,name:true,email:true}})添加索引优化查询model User { id Int id default(autoincrement()) email String unique db.VarChar(255) index([email]) // 添加索引 }使用关系查询而非手动 JOIN// 推荐constuserawaitprisma.user.findUnique({where:{id:1},include:{posts:true}})// 不推荐constpostsawaitprisma.post.findMany({where:{authorId:1}})参考资源Prisma 官方文档Prisma Schema 参考Prisma Client API