核心内容摘要
鲁鲁社安app:智慧安防,触手可及
ORM框架(Object-Relational Mapping)在传统开发模式中我们需要把数据存储到数据库所以需要通过SQL语句来进行操作例如查询新增修改删除等操作但是SQL语句太多了还比较繁琐所以就有了ORM框架。
ORM框架简单来说就是让我们通过熟悉的语法来操作数据库我们可以直接使用面向对象的方式来操作数据库ORM会把我们的操作映射成SQL语句然后执行。
面向对象查询:constuserawaitthis.prisma.user.findUnique({where:{id:1},select:{id:true,name:true,email:true}})console.log(user)SQL查询:SELECTid,name,emailFROMusersWHEREid1PrismaORM框架比较多这里我选择使用Prisma因为Prisma是TypeScript优先的ORM框架并且支持多种数据库包括MySQLPostgreSQLSQLiteMongoDB等。
它以其出色的性能、类型安全性以及与 GraphQL 和 REST API 的集成而闻名注我们当前使用的prisma版本是
7.
0为目前最新版(
-
他每个大版本是有很大差异的所以建议大家跟我安装一样的版本。
Postgresql数据库的种类也是非常多的这里我选择使用PostgreSQL完全开源免费我称为世界第一数据库(个人言论)因为他有非常强大的功能例如支持高级数据类型JSON数组枚举布尔值地理空间GIS,事务与并发能力更强并且还支持自定义扩展其功能。
PostgresSQL安装教程简单粗暴访问官网https://www.postgresql.org/download/选择适合你操作系统的版本然后下载安装即可。
使用docker安装dockerpull postgres:18dockerrun -d --name postgresServer -p6666:5432 -ePOSTGRES_PASSWORD123456postgres:18账号默认为postgres密码为123456端口号为6666。
安装数据库可视化工具打开vsCode/Cursor/WebStorm等代码编辑器安装Database Client插件然后连接数据库即可。
开始使用Prisma安装prisma:npmi prisma -D安装prisma客户端:npminstallprisma/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{providerprisma-client//使用什么客户端output../src/generated/prisma//生成客户端代码的目录}datasource db{providerpostgresql//连接什么数据库}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 KEYdefault(cuid()):默认生成一个唯一ID 类似于sql语句的AUTO_INCREMENTunique:唯一约束对应sql语句的UNIQUErelation:一对多关联对应sql语句的FOREIGN KEYrelation(fields: [authorId], references: [id],onDelete: Cascade,onUpdate: Cascade):一对多关联对应sql语句的FOREIGN KEYdefault(now()):默认生成当前时间 类似于sql语句的CURRENT_TIMESTAMPupdatedAt:更新时间 类似于sql语句的UPDATE CURRENT_TIMESTAMPonDelete: Cascade:级联删除(表示删除主表的时候从表也删除非常的方便啊)onUpdate: Cascade:级联更新(表示更新主表的时候从表也更新非常的方便啊)打开.env文件修改数据库连接信息连接规则:DATABASE_URL“postgresql://username:passwordlocalhost:5432/mydb?schemapublic”postgresql:数据库类型username:用户名password:密码localhost:主机名5432:端口号mydb:数据库名schemapublic:模式DATABASE_URLpostgresql://postgres:123456localhost:6666/test_db执行数据库迁移命令:npx prisma migrate dev --name init执行完成之后他会在prisma/migrations文件夹中生成一个migration文件并且生成一个sql文件然后自动执行sql文件创建表结构。
接着执行生成客户端代码命令npx prisma generate#生成路径是 schema.prisma 文件中client output的目录编写增删改查src/lib/prisma.tsimport{PrismaClient}from../generated/prisma/client//引入生成客户端代码import{PrismaPg}fromprisma/adapter-pg//引入适配器constpoolnewPrismaPg({connectionString:process.env.DATABASE_URL})//创建连接池constprismanewPrismaClient({adapter:pool})//创建客户端exportdefaultprisma//导出客户端src/app/api/route.tsimportprismafrom/lib/prisma;//lib是我在tsconfig.json中配置的别名表示src目录下的lib文件夹import{NextRequest,NextResponse}fromnext/server;//引入NextRequest, NextResponseexportasyncfunctionGET(request:NextRequest){constusersawaitprisma.user.findMany()//查询所有用户returnNextResponse.json(users)//返回用户列表}exportasyncfunctionPOST(request:NextRequest){const{name,email,password}awaitrequest.json()//获取请求体constuserawaitprisma.user.create({data:{name,email,password}//创建用户})returnNextResponse.json(user)//返回创建的用户}exportasyncfunctionPATCH(request:NextRequest){const{id,name,email,password}awaitrequest.json()//获取请求体constuserawaitprisma.user.update({where:{id},data:{name,email,password}//更新用户})returnNextResponse.json(user)//返回更新后的用户}exportasyncfunctionDELETE(request:NextRequest){const{id}awaitrequest.json()//获取请求体constuserawaitprisma.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:1testtest.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}