浅尝 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.rhkb.cn/news/311206.html

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

相关文章

MQ概览及Kafka详解

文章目录 概览MQ优点MQ缺点常见MQ对比JMS消息模型点对点模式发布订阅模式 kafka基础架构发布订阅工作流程生产者生产者文件存储生产者分区策略生产者数据可靠性保证生产者数据一致性保证生产者ack机制ExactlyOnce生产者发送消息流程 消费者消费者分区分配策略消费者消费数据问题…

平价健身运动耳机哪个好?真实分享五款高性能产品

在挑选这些耳机时,我们应该综合考虑了音质、舒适度、耐用性、稳定性以及价格等多个因素,无论你是跑步爱好者、健身达人还是户外运动者,接下来就让我们一起探索高性能平价健身运动耳机有哪些吧,都是我真实使用分享的哦。 第一款&am…

Web3与社会契约:去中心化治理的新模式

在数字化时代,技术不断为我们提供新的可能性,而Web3技术作为一种基于区块链的创新,正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑,还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…

如何在CentOS安装Firefox并结合内网穿透工具实现公网访问本地火狐浏览器

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

折叠面板组件(vue)

代码 <template><div class"collapse-info"><div class"collapse-title"><div class"title-left">{{ title }}</div><div click"changeHide"> <Button size"small" v-if"sho…

node后端上传文件到本地指定文件夹

实现 第一步&#xff0c;引入依赖 const fs require(fs) const multer require(multer) 第二步&#xff0c;先设置一个上传守卫&#xff0c;用于初步拦截异常请求 /*** 上传守卫* param req* param res* param next*/ function uploadFile (req, res, next) {// dest 值…

如何在SFTP工具中使用固定公网地址远程访问内网Termux系统

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

MVVM、MVC、MVP的区别

MVC、MVP 和 MVVM 是三种常见的软件架构设计模式&#xff0c;主要通过分离关注点的方式来组织代码结构&#xff0c;优化开发效率。 在开发单页面应用时&#xff0c;往往一个路由页面对应了一个脚本文件&#xff0c;所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取&a…

Day01-环境准备与镜像案例

Day01-环境准备与镜像案例 1. 容器架构1.1 Iaas Paas Saas (了解)1.2 什么是容器1.3 容器vs虚拟机1.4 Docker极速上手指南1&#xff09;配置docker源(用于安装docker)2&#xff09;docker下载镜像加速的配置3&#xff09;自动补全 1.5 Docker C/S架构1.6 Docker的镜像管理1&…

每日练习——leetcode402. 移掉 K 位数字和17. 电话号码的字母组合

目录 402. 移掉 K 位数字 题目描述 解题思路 代码实现 17. 电话号码的字母组合 题目描述 解题思路 代码实现 402. 移掉 K 位数字 题目描述 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请…

为了保护版权,有大量图片需要加logo水印怎么办?快速批量加水印 一键可批量加水印几十张 几百张

一&#xff0c;加水印必要性 在数字化时代&#xff0c;图片作为信息传递的重要媒介&#xff0c;其保护和管理显得尤为重要。而给图片添加水印则是一种有效的方式&#xff0c;它不仅能够防止图片被未经授权地复制和盗用&#xff0c;还能够标明图片的来源和版权信息&#xff0c;…

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value

目录 1、Autowired 自动装配 1.1、要实现自动装配不是一定要使用Autowired 1.2、Autowired的特性 &#xff08;1&#xff09;首先会根据类型去spring容器中找(bytype),如果有多个类型&#xff0c;会根据名字再去spring容器中找(byname) &#xff08;2&#xff09;如果根据名…

springcloud-fegin 组件调用

一、Feign 概述 Feign是Netflix开发的声明式、模板化的HTTP客户端&#xff0c; Feign可以帮助我们更快捷、优雅地调用HTTP API。 在Spring Cloud中&#xff0c;使用Feign非常简单——创建一个接口&#xff0c;并在接口上添加一些注解&#xff0c;代码就完成了。Feign支持多种…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重&#xff0c;部署问题 参考资料 简介 文章列表&#xff1a; llama-factory SFT系列教程 (一)&#xff0c;大模型 API 部署与使用llama-factory SFT系列教程 (二)&#xff0c;大模型在自定义数…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 成员变量&#xff08;实例变量&#xff09;类变量&#xff08;静态变量&#xff09;定义方式静态变量的使用场景 成员变量&#xff08;实例变量&#xff09; 成员变量声明在一个类中&#xff0c;但在方法、构造…

【opencv】示例-videocapture_openni.cpp 深度数据获取和处理的示例

该代码是一个与使用OpenCV进行深度传感器捕获和处理相关的程序的一部分。主要功能包括处理Kinect或XtionPRO等深度传感器数据&#xff0c;解析命令行参数&#xff0c;打开视频捕获设备&#xff0c;以及在GUI上显示深度图&#xff0c;彩色图像&#xff0c;和红外图像等。代码中使…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

byobu

byobu 终端多路复用器 一、byobu 安装二、byobu 使用三、其他终端多路复用器四、ssh byobu 远程协作 系统环境: linux(ubuntu,debian,kali) 一、byobu 安装 byobu 是包装过的tmux #sudo apt install tmux sudo apt install byobubyobu二、byobu 使用 创建窗口: Ctrl a c…