簡易的資料庫存取
GraphQL 伺服器中

透過 Prisma 在 GraphQL 中查詢來自 MySQL、PostgreSQL 和 SQL Server 資料庫的資料 – 適用於 JavaScript 和 TypeScript 的更優質 ORM。

tech

什麼是 Prisma?

Prisma 讓資料處理變得輕鬆!它提供型別安全的 Node.js 和 TypeScript ORM、全域資料庫快取、連線池以及即時資料庫事件。

查詢
// Creating a new record
await prisma.user.create({
firstName: “Alice”,
email: “alice@prisma.io”
})
表格
id firstName email
1 Bobby bobby@tables.io
2 Nilufar nilu@email.com
3 Jürgen jums@dums.edu
4 Alice alice@prisma.io

Prisma 和 GraphQL 如何結合

GraphQL 為 Web 和行動應用程式提供了一種從 API 獲取資料的強大方法。然而,作為後端開發人員,您仍然需要負責 如何 透過實作 GraphQL 解析器,讓您的 GraphQL 伺服器從資料庫檢索請求的資料 — 這就是 Prisma ORM 的用武之地。 Prisma ORM 在 GraphQL 解析器內部用於查詢資料庫。它與您最愛的 GraphQL 生態系統工具和函式庫無縫整合。

您也可以使用我們的額外工具來增強 Prisma ORM 的使用
Prisma Accelerate 是一個全域資料庫快取和可擴展的連線池,可加速您的資料庫查詢。
Prisma Pulse 使您能夠以型別安全的方式建構反應式即時應用程式。Pulse 是實作 GraphQL 訂閱或即時查詢的完美夥伴。

Prisma Schema

Prisma schema 使用 Prisma 的建模語言來定義您的資料庫結構描述。它使資料建模變得簡單直觀,尤其是在建模關聯時。

Prisma schema 的語法很大程度上受到 GraphQL SDL 的啟發。如果您已經熟悉 SDL,那麼學習它來建模您的資料庫表格將會非常容易。

1// Define the `User` table in the database
2model User {
3 id String @id @default(cuid())
4 email String @unique
5 password String
6 name String?
7 posts Post[]
8}
9
10// Define the `Post` table in the database
11model Post {
12 id String @id @default(cuid())
13 title String
14 content String?
15 authorId String
16 author User @relation(fields: [authorId], references: [id])
17}

Prisma 和 GraphQL 用例

無論您是使用來自 graphql-toolsmakeExecutableSchema 的 SDL 優先方法,還是像 Nexus 或 TypeGraphQL 這樣的程式碼優先方法,Prisma 都可以在您的 GraphQL 解析器中使用。

注意: 以下所有範例都使用 express-graphql 作為 GraphQL 伺服器,但它們也適用於任何其他函式庫,如 Apollo Server、NestJS 或 Mercurius。

GraphQL Tools (SDL 優先)

GraphQL Tools — SDL 優先

當使用 SDL 優先方法建構 GraphQL 結構描述時,您需要提供您的GraphQL 結構描述定義作為字串,以及一個解析器映射來實作此定義。在您的解析器內部,您可以使用 Prisma Client 來讀取和寫入資料庫中的資料,以便解析傳入的 GraphQL 查詢和變更。

1import { PrismaClient } from '@prisma/client';
2import express from 'express';
3import { graphqlHTTP } from 'express-graphql';
4import { makeExecutableSchema } from '@graphql-tools/schema';
5
6const prisma = new PrismaClient();
7
8const typeDefs = `
9 type User {
10 email: String!
11 name: String
12 }
13
14 type Query {
15 allUsers: [User!]!
16 }
17`;
18
19const resolvers = {
20 Query: {
21 allUsers: () => {
22 return prisma.user.findMany();
23 }
24 }
25};
26
27export const schema = makeExecutableSchema({
28 resolvers,
29 typeDefs,
30});
31
32const app = express();
33app.use('/graphql', graphqlHTTP({
34 schema,
35}));
36
37app.listen(4000);
Nexus (程式碼優先)
TypeGraphQL (程式碼優先)

GraphQL Tools — SDL 優先

當使用 SDL 優先方法建構 GraphQL 結構描述時,您需要提供您的GraphQL 結構描述定義作為字串,以及一個解析器映射來實作此定義。在您的解析器內部,您可以使用 Prisma Client 來讀取和寫入資料庫中的資料,以便解析傳入的 GraphQL 查詢和變更。

1import { PrismaClient } from '@prisma/client';
2import express from 'express';
3import { graphqlHTTP } from 'express-graphql';
4import { makeExecutableSchema } from '@graphql-tools/schema';
5
6const prisma = new PrismaClient();
7
8const typeDefs = `
9 type User {
10 email: String!
11 name: String
12 }
13
14 type Query {
15 allUsers: [User!]!
16 }
17`;
18
19const resolvers = {
20 Query: {
21 allUsers: () => {
22 return prisma.user.findMany();
23 }
24 }
25};
26
27export const schema = makeExecutableSchema({
28 resolvers,
29 typeDefs,
30});
31
32const app = express();
33app.use('/graphql', graphqlHTTP({
34 schema,
35}));
36
37app.listen(4000);

為什麼選擇 Prisma 和 GraphQL?

端對端型別安全

取得從資料庫到前端應用程式的一致型別,以提高生產力並避免錯誤。

最佳化的資料庫查詢

Prisma 的內建資料載入器確保最佳化且高效能的資料庫查詢,即使是 N+1 查詢也是如此。

型別安全的資料庫客戶端

Prisma Client 確保完全型別安全的資料庫查詢,並具有自動完成等優點 - 即使在 JavaScript 中也是如此。

直觀的資料建模

Prisma 的建模語言受到 GraphQL SDL 的啟發,讓您可以直觀地描述您的資料庫結構描述。

輕鬆的資料庫遷移

將您的 Prisma schema 映射到資料庫,這樣您就不需要編寫 SQL 來管理您的資料庫結構描述。

篩選器、分頁和排序

Prisma Client 透過為常見的資料庫功能提供便利的 API 來減少樣板程式碼。

Timeline from GraphCool to Prisma and Nexus Schema

我們 ❤️ GraphQL

在 Prisma,我們熱愛 GraphQL,並相信它光明的未來。自營運 Graphcool,一個流行的 GraphQL BaaS,我們在過去為 GraphQL 生態系統做出了很多貢獻,並且仍然投資於各種工具,以幫助開發人員採用 GraphQL。

我們也是 GraphQL 基金會 的驕傲成員,我們正在幫助推動 GraphQL 社群和生態系統向前發展。

我們的 GraphQL 資源

GraphQL Weekly

一份關於 GraphQL 社群和生態系統的每週新聞通訊

GraphQL Berlin Meetup

GraphQL Berlin Meetup 始於 2016 年,是世界上最受歡迎的 GraphQL Meetup 之一

How to GraphQL

我們建立了流行的全端 GraphQL 教學網站 How to GraphQL,以幫助教育開發人員了解 GraphQL。