浅尝 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.mzph.cn/news/820523.shtml

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

相关文章

JAVA_类和对象(1)

认识面向对象 Java是一门纯面向对象的语言(Object Oriented Program, OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。  面向过程和面相对象并不是一门语言,而是解决…

8thWall vs. AR.js

对于熟悉 JavaScript、WebGL 和 HTML5 等 Web 技术的数字创作者来说,8th Wall 提供了功能丰富且强大的 AR 开发平台,尽管价格较高。 然而,新手开发人员和专注于基于标记的 AR 的开发人员可能会发现 AR.js 更易于使用且更经济实惠。 1、8th Wa…

拉普拉斯金字塔的频谱分析

1. 基本分析 拉普拉斯金字塔分解,主要由以下步骤组成: 对输入图像 L0 进行低通滤波,其中常采用高斯滤波;对低通滤波后的图像进行 1/2 倍率的下采样,这里的下采样通常是指直接取偶行且偶列(以 0 开始计&am…

扫雷 【搜索,哈希】

9.扫雷 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N1e5100; int n,m,res0; struct pt{int x,y,r; }; typedef pair<int,int> pii; map <pii,int> a;//炸雷的map,键是x,y,值是r map <pii,int&…

ClickHouse--17--聚合函数总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 环境1.创建clickhouse表2.插入数据 函数(1)count&#xff1a;计算行数(2)min&#xff1a;计算最小值(3)max&#xff1a;计算最大值(4)sum&#xff1a;计算总和&…

密码学 | 椭圆曲线数字签名方法 ECDSA(上)

目录 1 ECDSA 是什么&#xff1f; 2 理解基础知识 3 为什么使用 ECDSA&#xff1f; 4 基础数学和二进制 5 哈希 6 ECDSA 方程 7 点加法 8 点乘法 9 陷阱门函数&#xff01; ⚠️ 原文&#xff1a;Understanding How ECDSA Protects Your Data. ⚠️ 写在前面…

测出Bug就完了?从4个方面教你Bug根因分析

01 现状及场景 &#x1f3af; 1.缺失bug根因分析环节 工作10年&#xff0c;虽然不是一线城市&#xff0c;也经历过几家公司&#xff0c;规模大的、规模小的都有&#xff0c;针对于测试行业很少有Bug根因环节&#xff0c;主流程基本上都是测试提交bug-开发修改-测试验证-发送报…

STM32标准库+HAL库 | CPU片内FLASH存储器数据掉电读写

一、片内FLASH 在STM32芯片内部有一个FLASH存储器&#xff0c;它主要用于存储代码&#xff0c;我们在电脑上编写好应用程序后&#xff0c;使用下载器把编译后的代码文件烧录到该内部FLASH中&#xff0c; 由于FLASH存储器的内容在掉电后不会丢失&#xff0c;芯片重新上电复位后&…

ArduPilot开源飞控之ROS系统简介

ArduPilot开源飞控之ROS系统简介 1. 源由2. ROS系统3. 安装2.1 安装Docker2.2 安装ROS2 4. 总结5. 补充资料 1. 源由 之前在ArduPilot开源飞控之硬件SBC分析中讨论过&#xff0c;个人角度最推荐其中两个系统是&#xff1a; Rpanion-server【推荐&#xff0c;简单】BlueOS【推…

Unity之Unity面试题(四)

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之Unity面试题&#xff08;四&#xff09; TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取…

什么是并行通信、串行通信?什么是全双工、半双工、单工? 什么是异步通信、同步通信? 什么是RS232、RS485?什么是pwm?

什么是并行通信、串行通信&#xff1f; 嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交&#xff0c;这里的主机可以是计算机也可以是嵌入式主机&#xff0c;甚至可以是芯片。主机间通信的方式一般可以分为两类&#xff1a;并行通信和串行通信。并行通信是指多个比特…

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…

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

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

华为再次布局新行业:合作伙伴已超前谋划,该领域将大有可为

华为布局新行业 华为向外界公布了一个重要信息&#xff1a;在过去的三年里&#xff0c;尽管受到美国的制裁&#xff0c;华为仍然成功地完成了超过13000个元器件的国产替代研发&#xff0c;以及4000多块电路板的迭代开发。 不仅在硬件领域取得了显著成就&#xff0c;在软件和生…

oracle 19c数据库W00n进程使用很多PGA内存资源的分析

今天&#xff0c;客户反馈测试环境的数据库PGA资源不足&#xff0c;报错ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT&#xff1b;分析是多个W00n进程使用大量PGA-触发了BUG&#xff0c;对应解决办法就是打补丁。&#xff08;民间办法就是KILL进程、重启数据库&…

3d视图模型乱了怎么调?---模大狮模型网

在进行3D建模时&#xff0c;有时候您可能会遇到视图模型混乱的情况。这可能是由于模型结构问题、导入导出错误或编辑操作不当等原因造成的。混乱的模型不仅影响工作效率&#xff0c;还可能导致渲染结果不理想。本文将介绍六种有效的方法来调整混乱的3D视图模型&#xff0c;帮助…

【数据可视化包Matplotlib】Matplotlib基本绘图方法

目录 一、Matplotlib绘图的基本流程&#xff08;一&#xff09;最简单的绘图&#xff08;仅指定y的值&#xff09;&#xff08;二&#xff09;更一般的绘图&#xff08;同时指定x和y的值&#xff09;&#xff08;三&#xff09;增加更多的绘图元素 二、布局相关的对象——Figur…

Python 物联网入门指南(四)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;构建光学字符识别的神经网络模块 本章介绍以下主题&#xff1a; 使用光学字符识别&#xff08;OCR&#xff09;系统 使…

多种方式打开SOLIDWORKS文件

在 SOLIDWORKS 中有多种打开文件的方法。一些最常用的方法包括双击文件资源管理器中的文件或拖放到 SOLIDWORKS 窗口中。当然&#xff0c;还有一种传统的方法&#xff0c;就是在SOLIDWORKS软件上方单击打开。 使用SOLIDWORKS“打开“命令 SOLIDWORKS 中的“打开“命令与任何其…

基于springboot实现在线考试系统设计【项目源码+论文说明】

基于springboot实现在线考试管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不…