浅尝 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;计算总和&…

rust嵌入式开发之基于await构造应用级临界区

在rust嵌入式开发之await一文中我们讨论了如何用await来实现异步操作的串行化。而并发编程时还有一个更重要的问题需要我们解决&#xff1a;资源竞争。 针对并发时的资源竞争&#xff0c;最简单的办法就是利用系统提供的临界区机制来互斥的使用资源。嵌入式rust提供了critical…

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

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

<Halcon> 变换矩阵求解

变换矩阵求解 hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate) hom_mat2d_translate通过向量t (Tx,Ty)向齐次二维变换矩阵HomMat2D添加平移&#xff0c;得到平移矩阵&#xff1b;vector_to_rigid( : : Px, Py, Qx, Qy : HomMat2D) vector_to_rigid近似于刚性…

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

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

rest_framework_mongoengine实现后端的增删改查

rest_framework_mongoengine实现后端增删改查 ‍ 一、增删改查 1. 继承ModelViewSet实现增删改查 父urls.py path("api/testapp/", include("apps.testapp.urls")), # 测试子urls.py # -*- coding: utf-8 -*- from django.urls import path from res…

如何在苹果手机上安装iOS应用的.ipa文件?

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;如今移动应用市场不断的发展&#xff0c;许多开发者小伙伴们都选择将他们的应用发布到苹果App Store上&#xff0c;但是&#xff0c;有时候他们可能希望通过直接分享IPA文件来分发他们的App&#xff0c;那…

自定义javax.validation 校验能用 spring

自定义注解 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;Target(ElementType.FIELD) Documented Retention(value RetentionPolicy.RUNTIME) Constraint(validatedBy {IdExistMyTestValidator.class }) public in…

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【推…

SAP Fiori开发中的JavaScript基础知识14 - promise, async, await异步编程

1. 前言 本文将介绍JavaScript中异步编程技术&#xff0c;包括promise, sync, await的使用。 2. Promise 2.1 简介 Promise 是 JavaScript 中用于处理异步操作的一种对象。它代表了一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。 Promise 对象有三种状…

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表项的动态学习&…

Android10以上MediaProject截屏

起因 在系统升级到Android10以上之后&#xff0c;之前的截屏方式不能用了&#xff0c;而且必须将MediaProject放在forground service里面跑才行。网上搜了一圈&#xff0c;都是语焉不详或者没有完整的一个代码应用。只能自己写一个&#xff0c;记录下 代码实现 新建一个Scre…

IO多路转接之poll

目录 1. poll 的基本认识 2. poll 基于 select 的突破 3. poll() 系统调用 3.1. struct pollfd 结构 4. poll() 的 demo 5. poll 的总结 1. poll 的基本认识 poll 是一种多路转接的方案&#xff0c; 它的核心功能和 select 一模一样&#xff0c;我们知道 IO 等待事件就绪…