浅尝 express + ORM框架 prisma 的结合

一、prisma起步

安装:

npm i prisma -g

查看初始化帮助信息:

prisma init -h

查看初始化帮助信息结果:

Set up a new Prisma projectUsage$ prisma init [options]
Options-h, --help   Display this help message
--datasource-provider   Define the datasource provider to use: postgresql, mysql, sqlite, sqlserver, mongodb or cockroachdb--generator-provider   Define the generator provider to use. Default: `prisma-client-js`--preview-feature   Define a preview feature to use.--output   Define Prisma Client generator output path to use.--url   Define a custom datasource urlExamplesSet up a new Prisma project with PostgreSQL (default)$ prisma initSet up a new Prisma project and specify MySQL as the datasource provider to use$ prisma init --datasource-provider mysqlSet up a new Prisma project and specify `prisma-client-go` as the generator provider to use$ prisma init --generator-provider prisma-client-goSet up a new Prisma project and specify `x` and `y` as the preview features to use$ prisma init --preview-feature x --preview-feature ySet up a new Prisma project and specify `./generated-client` as the output path to use$ prisma init --output ./generated-clientSet up a new Prisma project and specify the url that will be used$ prisma init --url mysql://user:password@localhost:3306/mydb

初始化:

#初始化项目,并指定采用的数据库类型为 xxxx 例子采用mysql
prisma init --datasource-provider mysql

初始化结果:


✔ Your Prisma schema was created at prisma/schema.prismaYou can now open it in your favorite editor.Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Run prisma db pull to turn your database schema into a Prisma schema.
3. Run prisma generate to generate the Prisma Client. You can then start querying your database.More information in our documentation:
https://pris.ly/d/getting-started┌────────────────────────────────────────────────────────────────┐
│  Developing real-time features?                                │
│  Prisma Pulse lets you respond instantly to database changes.  │
│  https://pris.ly/cli/pulse                                     │
└────────────────────────────────────────────────────────────────┘

初始化生成目录:
在这里插入图片描述

二、配置数据库连接

.env文件中对数据库连接信息进行配置:

更多数据库连接方式查看文档

# MySql 数据库的连接方式
# DATABASE_URL="mysql://账号:密码@主机:端口/数据库名"
DATABASE_URL="mysql://root:1234aa@localhost:3306/mysqlorm"

三、编写表结构

表结构在/prisma/schema.prisma文件中编写

1. model 表 声明

1.1 简单声明一个表的例子:
model User{id        Int      @id @default(autoincrement()) // id int 类型 自增email     String   @unique // email  String 类型 唯一项name      StringcreatedAt DateTime @default(now())
}
1.2 声明一对多表关联的例子
model User{id        Int      @id @default(autoincrement()) // id int 类型 自增email     String   @unique // email  String 类型 唯一项name      Stringposts      Post[] // 一对多的关系
}
model Post{id        Int      @id @default(autoincrement())title String content Stringauthor     User #relation(fields:[authorId],references:[id]) // 关联User表中的id到authorId字段authorId Int 
}
1.3 创建具体的表结构到数据库中

执行该语句如果数据库已经存在询问是否覆盖。

prisma migrate dev

可能得报错为mkdir 权限,找不到package.json文件
npm init 一下创建package.json文件再执行就好了

四、编写express

  1. 新建src目录用来编写接口文件进行操作数据库
  2. 新建启动文件main.js
const express = require('express') // 引入express
const { PrismaClient } =  require( '@prisma/client')// 引入prismaconst prisma = new PrismaClient() // new 新建类实例
const app = express()  // 初始化express
const port = 3000 // 端口号app.get('/test', async (req, res) => { // 启动测试服务try {// 类实例.表名.操作({ data:{filedName:filedValue})await prisma.user.create({ data: {name:'嘻嘻',email:'xxx@ww.com',posts:{ // 同步创建关联的post表信息。 这里的 posts 在 三、编写表结构中的1.2节定义create:[ // 操作 批量操作数组,单次操作数组内的单一对象即可 可继续嵌套{  title: 'My first post',content: 'This is my first post'},{title:'My 2nd post',content:'This is my 2nd post '}]}}})res.send('ok')} catch (error) {res.send(error)}
})app.listen(port, () => {console.log(`http://lcoalhost:${port}`)
})

插入数据

简单插入数据
await prisma.user.create({ data: {name:'嘻嘻',email:'xxx@ww.com'}})
复杂插入数据
// prisma 导入类new的实例 
// user 表名
// create 创建的操作
await prisma.user.create({ data: {name:'嘻嘻',email:'xxx@ww.com',posts:{ // 同步创建关联的post表信息。 这里的 posts 在 三、编写表结构中的1.2节定义create:[ // 操作 批量操作数组,单次操作数组内的单一对象即可 可继续嵌套{  title: 'My first post',content: 'This is my first post'},{title:'My 2nd post',content:'This is my 2nd post '}]}}})

查询数据

单表查询
// prisma 实例对象
// user 表名
// findMany 查找apiconst data = await prisma.user.findMany()
表关联查询
// prisma 实例对象
// user 表名
// findMany 查找api
// posts 关联 post表的字段const data = await prisma.user.findMany({include:{      posts:true}})
返回数据格式为树状
"data": [{"id": 1,"email": "fujsbah@sqq.com","name": "xxxx","posts": [{"id": 1,"title": "My first post","content": "This is my first post","authorId": 1},{"id": 2,"title": "My 2nd post","content": "This is my 2nd post ","authorId": 1}]},{"id": 2,"email": "jsbah@sqq.com","name": "xxxx","posts": [{"id": 3,"title": "My first post","content": "This is my first post","authorId": 2},{"id": 4,"title": "My 2nd post","content": "This is my 2nd post ","authorId": 2}]}]
条件查询
app.get('/user/:id', async (req, res) => {try {const data = await prisma.user.findUnique({where:{id:Number(req.params.id) // 2},include:{posts:true}})res.send({code:'000000',msg:'success',data})} catch (error) {res.send({code:'000003',msg:'error',data:error})}
})
条件查询响应
{"code": "000000","msg": "success","data": {"id": 2,"email": "jsbah@sqq.com","name": "xxxx","posts": [{"id": 3,"title": "My first post","content": "This is my first post","authorId": 2},{"id": 4,"title": "My 2nd post","content": "This is my 2nd post ","authorId": 2}]}
}

编辑数据

app.post('/update', upload.array(), async (req, res) => {const { name, id, email } = req.bodytry {let data = await prisma.user.update({data: {name,email},where: {id: Number(id)}})res.send({code: '000000',msg: 'success',data})} catch (error) {res.send({code: '000004',msg: 'error',data: error})}
})

删除数据

简单删除
app.post('/delete', upload.array(), async (req, res) => {const { id } = req.bodytry {// 删除post文章表中作者id等于传入的id的数据let deletePostData = await prisma.post.delete({where: {authorId: Number(id)}})res.send({code: '000000',msg: 'success',data:{deletePostData}})} catch (error) {res.send({code: '000005',msg: 'error',data: error})}
})
复合删除
app.post('/delete', upload.array(), async (req, res) => {const { id } = req.body// 目标删除用户try {// 先删除外键关联到用户id的文章表,这要是这个id的文章都删除let deletePostData = await prisma.post.delete({where: {authorId: Number(id)}})// 没有外键依赖到之后 根据id删除用户let deleteUserData =  await prisma.user.delete({where: {id: Number(id)}})res.send({code: '000000',msg: 'success',data:{deleteUserData,deletePostData}})} catch (error) {res.send({code: '000005',msg: 'error',data: error})}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623561.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为配置路由式Proxy ARP示例

配置路由式Proxy ARP示例 组网图形 图1 配置路由式Proxy ARP组网图 路由式Proxy ARP简介配置注意事项组网需求配置思路操作步骤配置文件 路由式Proxy ARP简介 企业内部进行子网划分时,可能会出现两个子网网络属于同一网段,但是却不属于同一物理网络的情…

思维导图ai生成软件分享5款好用的!

思维导图ai生成软件分享5款好用的! 在快节奏的信息时代,思维导图作为一种有效的思维整理工具,越来越受到人们的青睐。它能够将复杂的思维过程可视化,帮助我们更好地梳理思路、规划工作。近年来,随着人工智能技术的飞速…

云仓酒庄《综合品酒师》中国酒类行业发展在国际舞台上的新篇章

近日,云仓酒庄盛大举办的《综合品酒师》培训活动圆满落下帷幕,其规模盛大,参与人数众多,成功刷新了大世界基尼斯纪录,这一壮举不仅在国内酒类培训领域掀起了一股热潮,更在国际舞台上引起了广泛关注。 大世界…

Redis的IO模型 和 多线程问题

Redis中的线程和IO模型 什么是Reactor模式 ?单线程Reactor模式流程单线程Reactor,工作者线程池多Reactor线程模式 Redis中的线程和IO概述socketI/O多路复用程序文件事件分派器文件事件处理器文件事件的类型总结 多线程问题1. Redis6.0之前的版本真的是单…

适合小家电水箱液位检测的方法有哪些

如今随着智能化的发展,越来越多的小家电走进我们的生活,像制冰机、加湿器、咖啡机、饮水机等家电,在这些小家电中都会有一个水箱,在这些应用中都要用到液位检测功能,那么适合小家电水箱液位检测方法有哪些呢&#xff1…

Vue3 + Element-Plus 使用 Table 预览图片发生元素遮挡

Vue3 Element-Plus 使用 Table 预览图片发生元素遮挡 问题代码问题重现解决方法最终效果 问题代码 <el-table-column label"视频" align"center"><template #default"scope" style"display: flex;"><div style"…

jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况

在双系统中的ubuntu系统烧录没问题&#xff0c;但是电脑Ubuntu系统由于版本低&#xff0c;所以没有网络&#xff0c;烧录起来还的连网线&#xff0c;所以问了开发板的工程师&#xff0c;所幸&#xff0c;解决了问题&#xff0c;很感谢工程师的指导&#xff0c;特此记录一下&…

论文略读:Window Attention is Bugged: How not to Interpolate Position Embeddings

iclr 2024 reviewer 打分 6666 窗口注意力、位置嵌入以及高分辨率微调是现代Transformer X CV 时代的核心概念。论文发现&#xff0c;将这些几乎无处不在的组件简单地结合在一起&#xff0c;可能会对性能产生不利影响问题很简单&#xff1a;在使用窗口注意力时对位置嵌入进行插…

RACE IPEMD:构建安全基石的密码学原理与实践

title: RACE IPEMD&#xff1a;构建安全基石的密码学原理与实践 date: 2024/4/16 16:53:56 updated: 2024/4/16 16:53:56 tags: IPEMD哈希算法SHA-1SHA-2/3消息摘要数字签名安全分析 前言 在当今信息爆炸的时代&#xff0c;数据安全和隐私保护变得尤为重要。密码学作为信息安…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

FebHost:为什么注册.BE比利时域名?

.be 是比利时的国家代码顶级域名&#xff08;ccTLD&#xff09;&#xff0c;通常用于与该国有关的网网站。这个域名为那些希望在线上建立与比利时有关联系的个人、公司和组织提供了一个重要的网络标识。 .be 域名于1988年创建&#xff0c;由.BE域名注册机构管理&#xff0c;这…

leetcode hot100_day20

4/14/2024 128.最长连续序列 自己的 这是前两天做一半的题目了。这题给我的教训就是用哈希表的时候一定一定要考虑重复元素的问题&#xff01;&#xff01;&#xff01;&#xff01; 这题让我想到了最长递增子序列&#xff0c;只是名字有点像。子序列和子数组还不一样一个连续…