说明!⚠️ 对Prisma的粗浅尝试,主要是的目的就是希望能把 “如何入门” 给各位说清楚。除去基础的运用,这篇文章还包括了 Prisma 如何结合 graphql 的内容,敬请期待
源码地址 github
初探使用过程
本节 内容是 Prisma + Express + Mysql 进行的实践,没有特别复杂的场景,只是作为一个小的demo帮助大家入门使用 Prisma ,为迈入更高的Prisma 高级用法,提供基础。本节主要目标 构建一个Nodejs 的REST service
Prisma
- www.prisma.io/ 前往主页。了解一下它到底是个什么东西,我用一句话来概括:“它是一个orm 库 适合nodejs使用“。它的组成有三个部分
- “客户端工具,prisma-client-js”
- "cli工具生成的schema"
- 官方提供的可视化操作工具。
-
拉到页面最下面,找到 PRISMA WITH,点击with express,大概的看一遍 基本上是心里就有数了
-
找到 RESOURCES,找到Get Stated 按照官方文档走
-
关于query的方法 和其他文档在这里, query参数的参考指南Query参考手册; 关于各种概念的解释和文档:一些重要的概念
-
文档指南 点击这里
实战
1.首先哈,我们需要构建一个最简单的 express-node service
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
const posts = {
name:"666"
}
app.use(bodyParser.json())
app.get('/user/all', async (req, res) => {
res.json({
name: 6666
})
})
app.listen(3000)
执行下面的命令之后,我们就能够访问这个serve了
nodemon index.js
- 第二步, 按照官方的说明首先,我使用 prisma cli 初始化了 其配置
$ yarn add prisma
$ npx prisma init
# 这个命令做了两件事:
# 1.创建一个名为的新目录prisma,其中包含一个名为 的文件schema.prisma,该文件包含 Prisma 模式以及您的数据库连接变量和模式模型
# 2.在项目根目录下创建.env文件,用于定义环境变量(比如你的数据库连接)
- 第三步,按照官方要求,我去构建了我的结构,和数据库连接,
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String @db.VarChar(255)
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
model Profile {
id Int @id @default(autoincrement())
bio String?
user User @relation(fields: [userId], references: [id])
userId Int @unique
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
profile Profile?
}
环境配置
DATABASE_URL="mysql://root:rootroot@192.168.101.10:3306/node_prisma"
- 第四步,(依据模型去自动生成) 我们需要将定义的模型正确的生成SQL和表结构
$ npx prisma migrate dev --name init
# 上面的命令,帮助我们做了下面这件事
# 1. 它为此迁移创建一个新的 SQL 迁移文件, 后续 你会使用它的
# 2. 它针对数据库运行 SQL 迁移文件
- 第五步,使用客户端操作工具去操作数据库
$ yarn add @prisma/client
最后的你的代码就是这样的了,特别需要注意的是 ,对于关联关系的修改方法
const express = require('express')
const bodyParser = require('body-parser')
const prismaClint = require('@prisma/client')
// -------------init-------------
const prisma = new prismaClint.PrismaClient()
const app = express()
const posts = {
name:"666"
}
app.use(bodyParser.json())
// -------------CURD-------------
// 使用 prisma 写更少的代码,做更多的事情
app.get('/user/all', async (req, res) => {
const data = await prisma.user.findMany({
include:{ // 把其关联的东西都查询出来
posts:true,
profile:true
}
})
res.json(data)
})
app.post('/user/create', async (req, res) => {
const data = await prisma.user.create({
data: {
...req.body
// 如果有这样的外建 关系,prisma 会为我们自动关联 和创建,不需要我们操作
/**
* 你的对象应该张这样
* posts": {
"create": {
"title": "Hello World"
}
},
"profile": {
"create": {
"bio": "I like turtles"
}
}
*/
}
})
res.json(data)
})
app.put('/user', async (req, res) => {
const { id } = req.body;
const data = await prisma.user.update({
where: { id },
data: {
...req.body
}
});
res.json(data);
})
app.delete('/user/:id', async (req, res) => {
const { id } = req.params;
// 如果要删 这个用户,那么它关联的外 健 需要一并删除
const data = await prisma.user.update({
where: { id: Number(id) },
data:{
posts: {
// 单 有多个关联关系的时候使用这个, 它会物理删除!
// delete: [ { id: 2 } ] 难不成这个2 一直写出来?如果你需要,这个非常的香啊!
// 删除 全部请使用 下面的字段
deleteMany:{}
},
profile: { // 如果仅仅有一个的关联关系的时候使用这个, 它会物理删除!
delete:true
}
}
})
const isok = await prisma.user.delete({
where: { id: Number(id) },
})
res.json(isok)
})
const server = app.listen(3000, () => {
console.log('server start');
})
如果我们使用Prisma + Graphql呢?
说明 ?? 分支,我们再次打造的一个Prisma + graphql 的项目,使得我们的Server非常的简单且易懂。首先我这要说明一点:Graphql非常的冗长且复杂,它作为完全不同于SQL的一种查询语言,和规范,你如果用它 需要有一定的经验和踩坑,它的资料页不是很多,至少在国内是比较少。而且理解和编码SQL 都是一个完全不同的东西,因此需要一定的成本去试映这个东西,下面的东西是我个人的见解,如果有不对的地方 ,麻烦各位道友指点,关于graphql 。在我的别的文章中也有详细的描述,我们从一个0开始 构建一个完整的应用。
下面的结合 graphql的代码,原来的Prisma 的东西都不用变,我们只需要加入 express-graphql、graphql、graphql-tools 就好啦。
const express = require('express')
const bodyParser = require('body-parser')
const prismaClint = require('@prisma/client')
const { graphqlHTTP } = require('express-graphql');
const { makeExecutableSchema } = require('@graphql-tools/schema')
// 对于es6 使用 npx babel-node index.js 去编译 部分esModule,
// -------------init-------------
const prisma = new prismaClint.PrismaClient()
const app = express()
// -------------使用graphql-------------
// 1. 定义类型 和 query
const typeDefs = `
type User {
email: String!
name: String
}
type Query {
allUsers: [ User! ] !
}
`
// 2. 定义irsolvers 和 与前面对于的query参数
const resolvers = {
Query: {
allUsers: () => {
return prisma.user.findMany()
}
}
}
// 3. 定义 schema 规则
const schema = makeExecutableSchema({
resolvers,
typeDefs
})
app.use(bodyParser.json())
app.use("/graphql", graphqlHTTP({
schema
}))
const server = app.listen(3000, () => {
console.log('server start');
})
大部分的文章到这里就结束了,对于才接触Graphql的同学来说是远远不够的,但是我很良心!请把良心打在评论区!另外说明一个事情 postman 还是比较香的 它可以直接自动获取 graphql 的规则,如果你想了解更多,请看我的其他文章
curl --location --request POST 'http://localhost:3000/graphql' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": "query { allUsers { email } }"
}'
总结一下
上文我们花费了一些时间,我们从0 构建了一个Prisma 的Nodejs - service 。希望对你有帮助,这只是开始,接下来我们会结合NestJS 来分析和构建一个完整的NodeJS service 应用
源码地址 github