大學專題項目需求需要用Python當後端,可是又想要使用GraphQL,要在Python使用的話由於沒有原生或者ApolloServer的支持,所以只能用第三方庫來實現。

1/21/2024 (更

主要有:

  1. Strawberry 🍓

  2. Graphene

  3. Ariadne

  4. Tartiflette

這裡的資料是從官方教學來學習的

安裝Strawberry

用pip裝上strawberry庫

pip install strawberry-graphql

定義Schema

跟每個GraphQL一樣都需要設置Schema。不過在這裡是code first,而不是SDL first,所以寫法會不一樣。

建立一個schema.py

import typing
import strawberry

@strawberry.type
class Book:
	title: str
	author: str

@strawberry.type
class Query:
	books: typing.List[Book]

建立一個dummy數據庫卡來返回數據

def get_books():
	return [
		Book(
			title="The Great Gatsby",
			author="F. Scott Fitzgerald"
		),
	]

Schema.py 新增Query

@strawberry.type
class Query:
	books: typing.List[Book] = strawberry.field(resolver=get_books)

建立Schema實例

dummy數據和query都設定好後,就可以建立一個Schema實例。

schema = strawberry.Schema(query=Query)

然後在Terminal跑指令

strawberry server schema

然後一個GraphQL服務器就誕生啦!

Running strawberry on http://0.0.0.0:8000/graphql

就可以去http://0.0.0.0:8000/graphql

以上就是strawberry的官方教學!

Query想使用資料庫的“WHERE”該怎麼辦

這裡以我的畢業專題為例子,寫得不好不要鞭我(x
這裡創立一個User的Schema
這裡有個特別的是user_id使用了strawberry.ID

@strawberry.type
class User:
    user_id = strawberry.ID
    username: str
    display_name: str
    gender: str
    created_at: datetime
    updated_at: datetime
    email: str
    region: str
    hashed_password: str
    profileimg_url: str
    profilebanner_url: str
    DOB: datetime
    phone_number: int
    about: str
    first_name: str
    last_name: str
    full_name: str
    address: str

定義好Resolver,這裡我選擇使用的是Prisma來獲取我的資料,
你不一定要使用Prisma來進行資料庫交互
如果你不知道是Resolver,請去->學習學習GraphQL的基礎

from prisma import Prisma
import strawberry
def get_user(user_id: int):
    db = Prisma()
    db.connect()
    user = db.user.find_unique(where={'user_id': user_id})
    db.disconnect()
    return user

def get_users():
    db = Prisma()
    db.connect()
    users = db.user.find_many()
    db.disconnect()
    return users

如果不使用Prisma你的代碼會是這樣


import strawberry
def get_user(user_id: int): //這裡定義傳入的WHERE參數
    // 獲取你的資料的代碼
	//	獲取你的資料的代碼
	//	獲取你的資料的代碼
    return user

def get_users():
    // 獲取你的資料的代碼
	//	獲取你的資料的代碼
	//	獲取你的資料的代碼
    return users

再定義好Query,並且傳入Resolver

import strawberry
from src.model.User import User
from src.controller.user import *
@strawberry.type
class Query:
    user: User | None = strawberry.field(resolver=get_user)
    users: list[User] = strawberry.field(resolver=get_users)

你會發現誒?get_userget_users這兩個函數都沒有調用,
正常來說調用函數的情況會是get_user()get_users()
是的沒錯,GrapQL會幫你調用,不用你操心,你只要傳入正確的函數就可以了
resolver是不需要我們手動調用的