Prisma(四):连接本地数据库进行增删改查操作;Subscriptions 订阅

之前一直说的是连接新建数据库的情况,现在再来看看如何连接已有的数据库,并进行CRUD。

开始

1⃣️ 初始化项目 prisma init

prisma init 项目名 开始:

  • Set up a new Prisma server or deploy to an existing server?

    • 选择已存在的数据库。
  • What kind of database do you want to deploy to?

    • 我用的是 MongoDB 数据库,所以选择 MongoDB。
  • Enter MongoDB connection string

    • connection string 需要我们写上用户名和密码,所以我们先去 Robo 3T 设置一下:

      • read:允许用户读取指定数据库。
      • readWrite:允许用户读写指定数据库。
      • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile。
      • userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户。
      • clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
      • readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限。
      • readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限。
      • userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限。
      • dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
      # mongodb://用户名:密码@数据库服务器的主机:端口号/admin
      mongodb://censek:111@localhost:27017/admin
      
  • Please select the schema you want to introspect

    • 选择创建 datamodel 的数据库,我选择的是 eportal
  • Select the programming language for the generated Prisma client

    • 语言的话,依旧选择 JavaScript。

在这里插入图片描述
但是此时,datamodel.prisma 文件中并不是我选择的数据库的 datamodel ……

我们需要进行下一步操作 👇

2⃣️ 内省 prisma introspect

cd prisma4
prisma introspect

选择的内容和上一步骤一样。
在这里插入图片描述
可以看到已经生成了和选择的数据库对应的 datamodel:(就是我选的数据库有点庞大 😂)
在这里插入图片描述

3⃣️ 运行

在执行命令之前,我们需要先替换一下 datamodel 的内容:
🤔 有两种方案:
prisma.yml 文件中的 datamodel: datamodel.prisma 替换为 datamodel: datamodel-1584930097312.prisma
② 删除 datamodel.prisma ,把刚刚自动生成的 datamodel-1584930097312.prisma 重命名为 datamodel.prisma

docker-compose up -d  #启动服务器
prisma deploy

🤔 报错,查找解决方案,有以下两种方案:
docker-compose.yml 文件中 databases: 下:
① 直接删除 schema: eportal (⚠️不要注释掉)。
② 将 schema: eportal 替换为 database: eportal
在这里插入图片描述

如果提示 Errors,就按着它的提示对 .prisma 文件进行修改即可。
在这里插入图片描述

🎺 接下来,我们换一个简单点的数据库进行增删改查操作。

C

  • 分别新增两个表的内容,利用 connect 关联。
mutation {
  createStudent(
     data:{
       name:"小李",
     }
   ){
     _id,
     name,
   }
}

在这里插入图片描述

mutation {
	createJavascriptGrade(
    data:{
      student:{
        connect:{
          _id: "5e7b01b0027439000797fe87"
        }
      },
      grade:60
    }
  ){
    _id,
    student{
      name
    }
    grade
  }
}

在这里插入图片描述

  • 直接增加
mutation {
	createJavascriptGrade(
    data:{
      student:{
        create:{
          name: "小欧",
          number: "20190007",
          telphone: "18700000007"
        }
      },
      grade:99
    }
  ){
    _id,
    student{
      number,
      name
    }
    grade
  }
}

在这里插入图片描述
这个时候,“小欧” 的信息自动添加至 students 表中。

R

query {
  students{
    _id,
    number,
    name
  }
}

query 可省略。根据 DOCS 写语句就行 😄~

{
  javascriptGrades(where:{
    student: {
      number_contains:"20190004"
    }
  }){
    student {
      number,
      name
    },
    grade
  }
}

在这里插入图片描述

U

mutation {
  updateStudent(
    where:{
      _id: "5e7b01b0027439000797fe87"
    }
    data: {
      number: "20190006",
      telphone: "18700000006"
    }
  ){
    number,
    name,
    telphone
  }
}

在这里插入图片描述

D

mutation {
  deleteJavascriptGrade(
    where:{
    	_id: "5e7b041b027439000797fe89"
    }){
    _id,
    student{
      name
    }
  }
}

在这里插入图片描述


Prisma GraphQL API

Prisma service 的 GraphQL API 是在 Prisma GraphQL schema 中指定的。Prisma GraphQL schema 是基于 service 的 datamodel 自动生成的:

前面的内容对 querymutation 多次使用,故下面重点来看下没有用到的 subscriptions 订阅

Prisma 允许我们订阅三种不同类型的事件(datamodel 中的每种 type)。以我们常用来举例的 Post type 来说,这些事件是:

  • 创建新 Post 节点
  • 现有 Post 节点已更新
  • 删除现有 Post节点

Subscription type 的相应定义如下所示(此定义可在 Prisma GraphQL schema 中找到):

type Subscription {
  post(where: PostSubscriptionWhereInput): PostSubscriptionPayload
}

以下是 subscription 订阅操作的样子:

subscription {
  post {
    node {
      id
      title
    }
  }
}

如果没有通过 where 参数进一步约束,则 post 订阅将针对上述所有事件触发。来自服务器的消息中的 PostSubscriptionPayload 包含哪些字段取决于事件的类型。

过滤特定事件

where 参数允许客户准确指定他们感兴趣的事件。也许客户端总是只想在 …👇 时收到更新,如:

  • Post 被删除了
  • 一个 title 包含特定关键字的 Post 创建

可以使用 where 参数表达这些约束。where type 是 PostSubscriptionWhereInput

input PostSubscriptionWhereInput {
  # Filter for a specific mutation:
  # CREATED, UPDATED, DELETED
  mutation_in: [MutationType!]
  # Filter for a specific field being updated
  updatedFields_contains: String
  updatedFields_contains_every: [String!]
  updatedFields_contains_some: [String!]
  # Filter for concrete values of the Post being mutated
  node: PostWhereInput
  # Combine several filter conditions
  AND: [PostSubscriptionWhereInput!]
  OR: [PostSubscriptionWhereInput!]
}

上面提到的两个例子可以用 Prisma API 中的以下 subscriptions 来表达:

# Only fire for _deleted_ posts
subscription {
  post(where: {
    mutation_in: [DELETED]
  }) {
    # ... we'll talk about the selection set in a bit
  }
}
# Only fire when a post whose title contains "GraphQL" is _created_
subscription {
  post(where: {
    mutation_in: [CREATED]
    node: {
      title_contains: "GraphQL"
    }
  }) {
    # ... we'll talk about the selection set in a bit
  }
}

🔍 Subscriptions 详细介绍:https://prisma.yoga/docs/prisma1/part5#subscriptions



🔗:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章