Nodejs - Prisma 入门(Node - Express)

1,369 阅读5分钟

说明!⚠️ 对Prisma的粗浅尝试,主要是的目的就是希望能把 “如何入门” 给各位说清楚。除去基础的运用,这篇文章还包括了 Prisma 如何结合 graphql 的内容,敬请期待

源码地址 github

初探使用过程

本节 内容是 Prisma + Express + Mysql 进行的实践,没有特别复杂的场景,只是作为一个小的demo帮助大家入门使用 Prisma ,为迈入更高的Prisma 高级用法,提供基础。本节主要目标 构建一个Nodejs 的REST service

Prisma

  1. www.prisma.io/ 前往主页。了解一下它到底是个什么东西,我用一句话来概括:“它是一个orm 库 适合nodejs使用“。它的组成有三个部分
- “客户端工具,prisma-client-js” 
- "cli工具生成的schema" 
- 官方提供的可视化操作工具。
  1. 拉到页面最下面,找到 PRISMA WITH,点击with express,大概的看一遍 基本上是心里就有数了

  2. 找到 RESOURCES,找到Get Stated 按照官方文档走

  3. 关于query的方法 和其他文档在这里, query参数的参考指南Query参考手册; 关于各种概念的解释和文档:一些重要的概念

  4. 文档指南 点击这里

实战

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
  1. 第二步, 按照官方的说明首先,我使用 prisma cli 初始化了 其配置
$ yarn add prisma
$ npx prisma init 
# 这个命令做了两件事:

# 1.创建一个名为的新目录prisma,其中包含一个名为 的文件schema.prisma,该文件包含 Prisma 模式以及您的数据库连接变量和模式模型
# 2.在项目根目录下创建.env文件,用于定义环境变量(比如你的数据库连接)
  1. 第三步,按照官方要求,我去构建了我的结构,和数据库连接,
// 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"
  1. 第四步,(依据模型去自动生成) 我们需要将定义的模型正确的生成SQL和表结构
$ npx prisma migrate dev --name init
# 上面的命令,帮助我们做了下面这件事
# 1. 它为此迁移创建一个新的 SQL 迁移文件, 后续 你会使用它的 
# 2. 它针对数据库运行 SQL 迁移文件
  1. 第五步,使用客户端操作工具去操作数据库
$ 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