之前一直说的是连接新建数据库的情况,现在再来看看如何连接已有的数据库,并进行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 自动生成的:
前面的内容对 query
和 mutation
多次使用,故下面重点来看下没有用到的 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
🔗: