news 2026/6/10 16:40:46

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/6/10 12:29:59

深度解析79.5k星AI代理Clawdbot的持久记忆系统架构与实现

文章介绍了开源AI代理Clawdbot的持久记忆系统。该系统采用本地Markdown存储,结合向量搜索和BM25关键字检索,构建双层记忆架构(每日日志长期记忆)。系统支持自动压缩、记忆刷新和会话管理,确保信息持久性和上下文连贯性…

作者头像 李华
网站建设 2026/6/10 14:33:12

云计算第四次作业

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><title>微博发布</title><style>* { margin: 0; padding: 0; }ul { list-style: none; }.w { width: 900px; margin: 0 auto; }.controls texta…

作者头像 李华
网站建设 2026/6/10 12:37:05

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

一、项目介绍 本文介绍了一个基于深度学习YOLOv11算法的食物检测系统&#xff0c;能够准确识别30类常见食物及饮品。系统整合了完整的YOLO数据集、用户友好的UI界面&#xff08;含登录注册功能&#xff09;以及Python项目源码与预训练模型。该模型在包含14,661张图像的数据集上…

作者头像 李华
网站建设 2026/6/10 13:33:05

《唐朝诡事录之西行》——独孤羊放妻春条书

前年暑期&#xff0c;电视剧《唐朝诡事录之西行》播出&#xff0c;其中“仵作之死”单元令我印象深刻&#xff0c;尤其是独孤羊写给妻子春条的那封休书。基于这份触动&#xff0c;我使用 Unity3D 引擎制作了一个小项目&#xff0c;通过 TextMeshPro 实现文本横竖排显示&#xf…

作者头像 李华
网站建设 2026/6/10 8:58:08

一文讲清楚Java中的抽象类、接口和内部类三大特性

目录 第一章 抽象类 1.1 概述 1.1.1 抽象类引入 1.2 abstract使用格式 1.2.1 抽象方法 1.2.2 抽象类 1.2.3 抽象类的使用 1.3 抽象类的特征 1.4 抽象类的细节 1.5 抽象类存在的意义 第二章 接口 2.1 概述 2.2 定义格式 2.3 接口成分的特点 2.3.1.抽象方法 2.3.…

作者头像 李华
网站建设 2026/6/10 11:37:26

基于深度学习的可视化植物病害检测系统(YOLOv8+YOLO数据集+UI界面+Python项目+模型)

一、项目介绍 摘要 本项目开发了一套基于YOLOv8目标检测算法的可视化植物病害智能检测系统&#xff0c;专门用于识别和分类30种不同的植物叶片病害。系统训练数据集包含2009张训练图像和246张验证图像&#xff0c;涵盖了苹果、蓝莓、樱桃、玉米、桃子、土豆、大豆、草莓、番茄…

作者头像 李华