news 2026/7/26 16:08:28

Next.js第二十四章(Prisma)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Next.js第二十四章(Prisma)

ORM框架(Object-Relational Mapping)

在传统开发模式中,我们需要把数据存储到数据库,所以需要通过SQL语句来进行操作,例如查询新增修改删除等操作,但是SQL语句太多了,还比较繁琐,所以就有了ORM框架。

ORM框架简单来说就是让我们通过熟悉的语法来操作数据库,我们可以直接使用面向对象的方式来操作数据库,ORM会把我们的操作映射成SQL语句,然后执行。

面向对象查询:

constuser=awaitthis.prisma.user.findUnique({where:{id:1},select:{id:true,name:true,email:true}})console.log(user)

SQL查询:

SELECTid,name,emailFROMusersWHEREid=1

Prisma

ORM框架比较多,这里我选择使用Prisma,因为PrismaTypeScript优先的ORM框架,并且支持多种数据库,包括MySQLPostgreSQLSQLiteMongoDB等。它以其出色的性能、类型安全性以及与 GraphQL 和 REST API 的集成而闻名

注:我们当前使用的prisma版本是7.3.0为目前最新版(2026-01-29),他每个大版本是有很大差异的,所以建议大家跟我安装一样的版本。

Postgresql

数据库的种类也是非常多的,这里我选择使用PostgreSQL,完全开源免费,我称为世界第一数据库(个人言论),因为他有非常强大的功能,例如支持高级数据类型,JSON数组枚举布尔值地理空间GIS,事务与并发能力更强,并且还支持自定义扩展其功能。

PostgresSQL安装教程

  1. 简单粗暴,访问官网https://www.postgresql.org/download/,选择适合你操作系统的版本,然后下载安装即可。



  1. 使用docker安装
dockerpull postgres:18dockerrun -d --name postgresServer -p6666:5432 -ePOSTGRES_PASSWORD=123456postgres:18

账号默认为postgres,密码为123456,端口号为6666

安装数据库可视化工具:打开vsCode/Cursor/WebStorm等代码编辑器,安装Database Client插件,然后连接数据库即可。


开始使用Prisma

安装prisma:

npmi prisma -D

安装prisma客户端:

npminstall@prisma/client @prisma/adapter-pg pg dotenv

注: prisma7版本需要独立安装适配器

例如postgresql需要安装@prisma/adapter-pgmysql需要安装@prisma/adapter-mariadb

其他数据库请参考https://www.prisma.io/docs/getting-started/prisma-orm/quickstart/prisma-postgres

在Next.js项目根目录执行以下命令,初始化prisma:

npx prisma init

执行完成之后他会自动生成prisma文件夹,并且生成schema.prisma文件,以及创建一个env文件和prisma.config.ts文件。

打开prisma/schema.prisma文件,添加以下内容:

generator client{provider="prisma-client"//使用什么客户端output="../src/generated/prisma"//生成客户端代码的目录}datasource db{provider="postgresql"//连接什么数据库}model User{id String @id @default(cuid())//主键name String//用户名email String @unique//邮箱password String//密码createdAt DateTime @default(now())//创建时间updatedAt DateTime @updatedAt//更新时间posts Post[]//关联文章}model Post{id String @id @default(cuid())//主键title String//标题content String//内容createdAt DateTime @default(now())//创建时间updatedAt DateTime @updatedAt//更新时间authorId String//作者IDauthor User @relation(fields:[authorId],references:[id],onDelete:Cascade,onUpdate:Cascade)//一对多关联}
  • @id:主键对应sql语句的PRIMARY KEY
  • @default(cuid()):默认生成一个唯一ID 类似于sql语句的AUTO_INCREMENT
  • @unique:唯一约束对应sql语句的UNIQUE
  • @relation:一对多关联对应sql语句的FOREIGN KEY
  • @relation(fields: [authorId], references: [id],onDelete: Cascade,onUpdate: Cascade):一对多关联对应sql语句的FOREIGN KEY
  • @default(now()):默认生成当前时间 类似于sql语句的CURRENT_TIMESTAMP
  • @updatedAt:更新时间 类似于sql语句的UPDATE CURRENT_TIMESTAMP
  • onDelete: Cascade:级联删除(表示删除主表的时候,从表也删除,非常的方便啊)
  • onUpdate: Cascade:级联更新(表示更新主表的时候,从表也更新,非常的方便啊)

打开.env文件,修改数据库连接信息:

连接规则:DATABASE_URL=“postgresql://username:password@localhost:5432/mydb?schema=public”

  • postgresql:数据库类型
  • username:用户名
  • password:密码
  • localhost:主机名
  • 5432:端口号
  • mydb:数据库名
  • schema=public:模式
DATABASE_URL="postgresql://postgres:123456@localhost:6666/test_db"

执行数据库迁移命令:

npx prisma migrate dev --name init

执行完成之后他会在prisma/migrations文件夹中生成一个migration文件,并且生成一个sql文件,然后自动执行sql文件,创建表结构。

接着执行生成客户端代码命令:

npx prisma generate#生成路径是 schema.prisma 文件中client output的目录

编写增删改查

src/lib/prisma.ts

import{PrismaClient}from'../generated/prisma/client'//引入生成客户端代码import{PrismaPg}from'@prisma/adapter-pg'//引入适配器constpool=newPrismaPg({connectionString:process.env.DATABASE_URL})//创建连接池constprisma=newPrismaClient({adapter:pool})//创建客户端exportdefaultprisma//导出客户端

src/app/api/route.ts

importprismafrom"@/lib/prisma";//@lib是我在tsconfig.json中配置的别名,表示src目录下的lib文件夹import{NextRequest,NextResponse}from"next/server";//引入NextRequest, NextResponseexportasyncfunctionGET(request:NextRequest){constusers=awaitprisma.user.findMany()//查询所有用户returnNextResponse.json(users)//返回用户列表}exportasyncfunctionPOST(request:NextRequest){const{name,email,password}=awaitrequest.json()//获取请求体constuser=awaitprisma.user.create({data:{name,email,password}//创建用户})returnNextResponse.json(user)//返回创建的用户}exportasyncfunctionPATCH(request:NextRequest){const{id,name,email,password}=awaitrequest.json()//获取请求体constuser=awaitprisma.user.update({where:{id},data:{name,email,password}//更新用户})returnNextResponse.json(user)//返回更新后的用户}exportasyncfunctionDELETE(request:NextRequest){const{id}=awaitrequest.json()//获取请求体constuser=awaitprisma.user.delete({where:{id}//删除用户})returnNextResponse.json(user)//返回删除后的用户}

index.http

执行http文件需要在插件市场安装REST Client,然后打开http文件,点击Send Request按钮即可。

### 创建用户POST http://localhost:8888/api Content-Type: application/json{"name":"test","email":"1test@test.com","password":"123456"}### 查询所有用户GET http://localhost:8888/api### 更新用户PATCH http://localhost:8888/api Content-Type: application/json{"id":"cmkyoxflr00004ck82ywc6joi","name":"xiaoman","email":"xiaomansdasdas","password":"dasdasda"}### 删除用户DELETE http://localhost:8888/api Content-Type: application/json{"id":"cmkyoxflr00004ck82ywc6joi"}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/25 18:34:35

小程序毕设项目:基于springboot健身房预约平台小程序的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/26 8:52:10

wp子比主题发卡插件源码zibll主题发卡插件

源码介绍:Zibll子比主题目前没有自动发卡功能,但是很多用户希望能够实现自助发卡和销售激活码等功能。 为了满足这一需求,我们今天向大家介绍一款某大佬定制的自助发卡插件。该插件具有以下功能:可以在线添加卡密信息;…

作者头像 李华
网站建设 2026/7/25 23:33:09

基于深度学习YOLOv12的食物检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本文介绍了一个基于YOLOv12深度学习模型的食品检测系统,该系统能够识别30类常见食物和饮料。系统采用先进的YOLOv12目标检测算法,配合精心构建的食品数据集,实现了高效的食品识别功能。项目包含完整的Python实现代码、预训练模型…

作者头像 李华
网站建设 2026/7/26 7:25:51

基于深度学习YOLOv12的花生种子霉变识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本研究开发了一套基于最新YOLOv12深度学习算法的花生种子霉变检测系统,实现了对花生种子霉变情况的快速、准确识别。系统采用先进的计算机视觉技术,能够高效区分"霉变"和"未霉变"两类花生种子。项目包含完整的Python实…

作者头像 李华
网站建设 2026/7/24 4:40:37

安装Mosquitto

用于MQTT私有云架设的服务器端和客户端的核心代码。 稳定支持断线自动重连。公网服务器,内网内网服务器或者租赁腾讯轻服务器均可架设。 实现MQTT通信和数据存储。最近在折腾MQTT私有云的架设,感觉这玩意儿挺有意思的。MQTT(Message Queuing …

作者头像 李华