之前一直說的是連接新建數據庫的情況,現在再來看看如何連接已有的數據庫,並進行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
🔗: