《小鑫发现》之GraphQL框架Prisma
ccwgpt 2024-11-18 09:34 23 浏览 0 评论
标题
《小鑫发现》之GraphQL框架Prisma
介绍
这是一个新的前后端交互的方案,不是一定是最好的,但是却很有意思,一种可以让前端人员自由去控制数据库,脱离开后端人员开发SQL读取数据库一层。 虽然不见得能解决所有场景,只有善加利用,很可能解决绝大部分的场景,减少人力,提高效率。 很类似之前的hibernate那种对象的形式操作数据库,其实官网的第一句话:
“Next-generation ORM for Node.js and TypeScript”
可知他是个ORM,跟mybatis是一类。去理解如何用对象,或者说 用图的形式去描述数据。
版本和下载
node v15.5.1
下载地址 (https://nodejs.org/zh-cn/)
npm 7.3.0
下载地址 (https://nodejs.org/zh-cn/)
小记
本人在研究过程中发现,通过官方的ts教程,一直报错,原因暂时不知道,主要是不会ts,另外也可能是阿里镜像的问题,即使我删了也是不行,所以这个教程,从下载官方的demo开始。咱们分两步,第一步先构建一个脚本的框架,先去试试Prisma的魅力,第二步,构建一个node服务,框架式Express+Prisma,将其服务化,提供给前端。
初次构建
准备工作
此次咱们使用MySQL, 数据库脚本地址 下载地址这里直接站出来,数据库名为mydb,加了点自己的小小创意。
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
USE mydb;
CREATE TABLE User (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE Post (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
title VARCHAR(255) NOT NULL,
createdAt TIMESTAMP NOT NULL DEFAULT now(),
content TEXT,
published BOOLEAN NOT NULL DEFAULT false,
authorId INTEGER NOT NULL,
FOREIGN KEY (authorId) REFERENCES User(id)
);
CREATE TABLE Profile (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
bio TEXT,
userId INTEGER UNIQUE NOT NULL,
FOREIGN KEY (userId) REFERENCES User(id)
);
INSERT INTO `mydb`.`Post`(`title`, `createdAt`, `content`, `published`, `authorId`) VALUES ('Hello World', '2021-01-21 15:53:37', NULL, 0, 6);
INSERT INTO `mydb`.`User`( `name`, `email`) VALUES ('Sarah', 'sarah@prisma.io');
INSERT INTO `mydb`.`User`(`name`, `email`) VALUES ('Maria', 'maria@prisma.io');
然后下载官方的demo,
地址是 https://www.prisma.io/docs/getting-started/quickstart-node
根据自己的环境进行下载。mine 是 mac。
下载完毕后,会有start文件夹,结构如下
start
---package.json #这个就不多说,懂则懂,不懂就算了
---prisma # 这是关键,prisma的主要目录,配置都在这里
------dev.db # 这是SQLite需要的,咱们是MySQL版本,所以就让他静静的呆着吧
------schema.prisma # 关键的东西,主要配置都在这里,数据配置啊,对象逻辑啊
---script.js # 这次的使用脚本,后续运行都是这里
官方是SQLite版本,咱们需要做一些改动,改成我这样,你们一定能看懂,我相信你们。 在prisma修改一个.env文件(这里是隐藏文件,记得取消隐藏),里面内容如下
DATABASE_URL="mysql://root:mims@127.0.0.1.2:3306/mydb"
然后编辑schema.prisma,将provider改成mysql
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
接下来咱们安装依赖,祖传命令 npm install,我这里是去掉了阿里镜像,速度会慢一些,因为我怕阿里镜像有的没有,导致一些问题(别问,问就是我真的试验了好久)
完毕之后,执行 npx prisma introspect
如果大家在这里发现 npx不管用,可以试试 npm install @prisma/cli --save-dev 安装一下环境,我这里是忘记了,怎么出来的,这里就先给大家提示一下,别问,问就是忘了 。
再次查看schema.prisma,文件内容发生了变化,其实就是用过通过命令,让prisma链接数据库,生成对应的对象,很像mybatis-generator。
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model Post {
id Int @id @default(autoincrement())
title String
createdAt DateTime @default(now())
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
@@index([authorId], name: "authorId")
}
model User {
id Int @id @default(autoincrement())
name String?
email String @unique
posts Post[]
Profile Profile?
}
model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
User User @relation(fields: [userId], references: [id])
}
这里咱们需要改动一下内容,方便咱们后面进行测试。直接上代码,你们可以直接替换就好。主要改动的地方,Post里的 User->aothor,Profile里的User -> user,User里的Post -> posts,Profile -> profile。别问为啥,问就是官方就是这么干的,其实我在想为啥不直接改数据字段名称呢。
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id Int @id @default(autoincrement())
title String
createdAt DateTime @default(now())
content String?
published Boolean @default(false)
authorId Int
author User @relation(fields: [authorId], references: [id])
@@index([authorId], name: "authorId")
}
model Profile {
id Int @id @default(autoincrement())
bio String?
userId Int @unique
user User @relation(fields: [userId], references: [id])
}
model User {
id Int @id @default(autoincrement())
name String?
email String @unique
posts Post[]
profile Profile?
}
然后执行 npx prisma generate,去生成client 。注意这里生成的文件路径是这个 /node_modules/.prisma/client/schema.prisma ,主要起作用的也是这个文件所在的文件夹,我的理解。
这里注意,一个关键点,每次改动schema.prisma,都需要执行一次 npx prisma generate,让其重新生成一遍client,这样才会有效果。
至此所有的准备工作都已经准备好了,剩下的就是看下效果了。 修改script.js的内容。
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
// A `main` function so that you can use async/await
async function main() {
// 这里是增加的代码,看名字就知道是啥意思了吧
const allUsers = await prisma.user.findMany()
console.log(allUsers)
}
main()
.catch(e => {
throw e
})
.finally(async () => {
await prisma.$disconnect()
})
然后执行 npm run dev
神奇数据出来了,大家会发现,好像没啥神奇的,慢慢来,其实从构建到现在咱们没有做逻辑代码编写,都是靠prisma这个框架实现的,接下来介绍用对象的,也是图的方式去描述一下数据,会有什么效果。
继续修改script.js,修改main方法,为这样,这里大家可以理解一下,这个data对象咋回事,运行之后有什么效果,这里就是对象的形式去描述要插入的数据,user,post,写好对应的方法,例如create,就可以直接创建,要是咱们之前方法,是不是都得挨个写一遍insert呢,这里这些官架子都是prisma提供的,查看官方的文档,你就全了解了,用对象的 ,也是图的方式去描述数据,让prisma去操作,这也是GraphQL的理念。
官方api的地址。
(https://www.prisma.io/docs/concepts/components/prisma-client/crud)
async function main() {
await prisma.user.create({
data: {
name: "Alice",
email: "alice@prisma.io",
posts: {
create: { title: "Hello World" },
},
profile: {
create: { bio: "I like turtles" }
}
}
})
const allUsers = await prisma.user.findMany({
include: {
posts: true,
profile: true
},
})
console.dir(allUsers, { depth: null })
}
再次执行 npm run dev
$ npm run dev
> script@1.0.0 dev
> node ./script.js
[
{
id: 5,
name: 'Sarah',
email: 'sarah@prisma.io',
posts: [],
profile: null
},
{
id: 6,
name: 'Maria',
email: 'maria@prisma.io',
posts: [
{
id: 4,
title: 'Hello World',
createdAt: 2021-01-21T15:53:37.000Z,
content: null,
published: false,
authorId: 6
}
],
profile: null
},
{
id: 10,
name: 'Alice',
email: 'alice@prisma.io',
posts: [
{
id: 6,
title: 'Hello World',
createdAt: 2021-01-21T08:09:06.000Z,
content: null,
published: false,
authorId: 10
}
],
profile: { id: 2, bio: 'I like turtles', userId: 10 }
}
]
服务化构建
这一步开始去改在成Express服务化,依然使用官方的例子,简单直接。
github地址
(https://github.com/prisma/prisma-examples/blob/latest/javascript/rest-express/README.md)
本人是Mac就是直接用命令,Windows可以去下载
curl https://codeload.github.com/prisma/prisma-examples/tar.gz/latest | tar -xz --strip=2 prisma-examples-latest/javascript/rest-express
下载完成之后 ,咱们用webstorm打开,这里大家就会发现其实,目录结构是一样的,多了个src,这个里面有个index.js这个就是咱们需要服务的主文件,以及接口都在这里写。 然后按照之前的教程,修改数据库,然后执行对应的命令,然后修改一下schema.prisma。这里就列出需要执行的命令,数据库和schema.prisma按照之前的教程修改,其实就是把之前的逻辑走一遍。
$ npm install
$ npx prisma introspect
$ npx prisma generate
如果之前的教程都执行没问题,这里就应该没事,然后咱们就去看 src/index.js 。 然后咱们启动一下看看,命令是npm run dev
大家可以试试官方的里面的几个api去测试一下,了解一下如何描述数据对象。我这里开始改造,将其改造为前端直接控制数据对象,通过接口去描述实现查询和创建。 直接上代码。
const express = require('express')
const bodyParser = require('body-parser')
const {PrismaClient} = require('@prisma/client')
const prisma = new PrismaClient()
const app = express()
app.use(bodyParser.json())
app.get(`/user`, async (req, res) => {
const result = await prisma.user.findMany({
...req.body
})
res.json(result)
})
app.post(`/user`, async (req, res) => {
const result = await prisma.user.create({
...req.body
})
res.json(result)
})
const server = app.listen(3000, () =>
console.log(
' Server ready at: http://localhost:3000\n?? See sample requests: http://pris.ly/e/ts/rest-express#3-using-the-rest-api',
),
)
postman 测试 这是查询,都是prisma的语法,然后需要配合schema.prisma里的model,进行匹配,达到效果。大家可以自己尝试一下描述一些对象,去获取东西。
这是个新建 我描述了相应的创建对象user data,然后里面描述了 posts - create对象达到了效果。查看数据库。
这次教程只是简单的介绍一下Prisma这个框架,后续有时间会更深入的进行了解,看看能不能形成一套完全可用的服务,我认为可以。
参考连接
[Prisma官方快速开始]
(https://www.prisma.io/docs/getting-started/quickstart-node)
可以选择语言,右上角,我选择是JS
[官方Express版本]
(https://github.com/prisma/prisma-examples/blob/latest/javascript/rest-express/README.md)
[中文文档]
(https://prisma.yoga/docs/prisma2/data-modeling#%E6%95%B0%E6%8D%AE%E6%A8%A1%E5%9E%8B%E5%AE%9A%E4%B9%89)
[官方API教程]
(https://www.prisma.io/docs/concepts/components/prisma-client/crud)
深入了解如何使用就得看这个
相关推荐
- 如何使用PIL生成验证码?(pi验证教程)
-
web项目中遇到使用验证码的情况有很多,进行介绍下使用PIL生成验证码的方法。安装开始安装PIL的过程确实麻烦各种问题层出不绝,不过不断深入后就没有这方面的困扰了:windows安装:直接安装Pil...
- Python必学!3步解锁asyncio异步编程 性能直接狂飙10倍!
-
还在用传统同步代码被IO阻塞卡到崩溃?别当“代码苦行僧”了!Python的asyncio模块堪称异步编程的“开挂神器”,处理高并发任务就像开了涡轮增压!不管是网络爬虫、API接口开发还是文件批量处理,...
- Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
-
定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单、卡单的情况,账单变成了“单边账”,这种情况对于支付用户来说,毫无疑问是灾难级别的体验,明明自己付了...
- Python学习怎么入门?附真实学习方法
-
Python技术在企业中应用的越来越广泛,因此企业对于Python方面专业人才的需求也越来越大,那对于之前对Python没有任何了解和接触的人而言,想要从零开始学习并不是一件容易的事情,接下来小U就为...
- PySpider框架的使用(pyspider 教程)
-
PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...
- 大学计算机专业 学习Python学习路线图(最新版)
-
这是我刚开始学习python时的一套学习路线,从入门到上手。(不敢说精通,哈哈~)希望对大家有帮助哈~大家需要高清得完整python学习路线可以【文末有获取方式】【文末有获取方式】一、Python入门...
- 阿里巴巴打造的400集Python视频合集免费学起来,学完万物皆可爬
-
第一阶段Python入门章节1:Python入门章节2:编程基本概念章节3:序列章节4:控制语句章节5:函数章节6:面向对象编程第二阶段Python深入与提高章节1:异常处理章节2:游戏开发-坦克大...
- Nginx Gunicorn在服务器中分别起什么作用
-
大部分人在gunicorn前面部署一层nginx的时候也的确没有想过为什么,他们只是觉得这样显得他们比较专业,而且幻想着加了一层nginx反向代理之后性能会有提升,恕我直言,请你们带上脑子,一个单纯的...
- Python培训怎么学?Python基础技术总结!值得一看
-
Python培训如今越来越被更多人所接受,相比自学参加Python培训的好处也是显而易见,但Python毕竟属于后端编程开发的主流语言,其知识机构还是比较庞大的,那Python培训怎么学?以及Pyth...
- 使用Tornado部署Flask项目(tornado async)
-
Tornado不仅仅是一个WEB框架,也可以是一个WEB服务器。在Tornado中我们可以使用wsgi模块下的WSGIContainer类运行其他WSGI应用如:Fask,Bottle,Djang...
- Python Web框架哪个好用?(python3 web框架)
-
问:PythonWeb框架哪个好用? 答: 1.Django Django是Python世界中最出名、最成熟的Web框架。Django功能全面,各模块之间结合紧密,(不讲其他的)Djang...
- Vue3.0+Tornado6.1发布订阅模式打造异步非阻塞实时=通信聊天系统
-
“表达欲”是人类成长史上的强大“源动力”,恩格斯早就直截了当地指出,处在蒙昧时代即低级阶段的人类,“以果实、坚果、根作为食物;音节清晰的语言的产生是这一时期的主要成就”。而在网络时代人们的表达欲往往更...
- Python开源项目合集(第三方平台)(python第三方开发工具)
-
wechat-python-sdk-wechat-python-sdk微信公众平台Python开发包http://wechat-python-sdk.readthedocs.org/,非官方...
- IT界10倍高效学习法!用这种方式,一年学完清华大学四年的课程
-
有没有在某一个瞬间,让你放弃学编程刚开始学python时,我找了几十本国内外的python编程书籍学习后,我还是似懂非懂,那些书里面到处都是抽象的概念,复杂的逻辑,这样的书,对于专业开发者来说,在平常...
- 如何将Python算法模型注册成Spark UDF函数实现全景模型部署
-
背景Background对于算法业务团队来说,将训练好的模型部署成服务的业务场景是非常常见的。通常会应用于三个场景:部署到流式程序里,比如风控需要通过流式处理来实时监控。部署到批任务中部署成API服...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何使用PIL生成验证码?(pi验证教程)
- Python必学!3步解锁asyncio异步编程 性能直接狂飙10倍!
- Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
- Python学习怎么入门?附真实学习方法
- PySpider框架的使用(pyspider 教程)
- 大学计算机专业 学习Python学习路线图(最新版)
- 阿里巴巴打造的400集Python视频合集免费学起来,学完万物皆可爬
- Nginx Gunicorn在服务器中分别起什么作用
- Python培训怎么学?Python基础技术总结!值得一看
- 使用Tornado部署Flask项目(tornado async)
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)