全能編程開發工程師必備技能之一——provice詳解

一、provice的概述

Provice是一個基於Python的極簡潔GraphQL API框架。 Provice不需要特定的ORM或資料庫集成,藉助乾淨的API分離了查詢邏輯和處理程序的語義。

該框架重在將最重要的基礎構建塊與核心QieryResolver的使用方式結合起來,並採用Python中的一些編程模式,例如:基類和元類,來提供鉤子和擴展,以滿足更高級別的要求。

儘管Provice處理程序在概念上像Django視圖函數,但由於其神經台階查詢語言和 GraphQL 架構,它比Django更適合為大型應用程序設計。

二、安裝和配置Provice

1. 安裝


pip install provice
pip install graphene
pip install sqlalchemy
pip install aiohttp

2. 配置


from sqlalchemy import create_engine
from settings import DATABASE_URL

engine = create_engine(DATABASE_URL, echo=True)

三、Provice API的實現

1. Schema和RootResolver

Provice的一切都是從Schema和Root Resolver開始的。這些類分別表示GraphQL架構的根。Provice僅支持單個查詢類型(QueryResolver)。這意味著,整個API都從這個查詢開始;類似於所有SQL查詢從 根表(root table)開始一樣。為了構建這個查詢,我們需要一個名稱為QueryResolver的Python類。此類不需要定義任何特殊方法。這個類的作用是指定我們GraphQL API中的所有可用查詢(Query)類型。在本程序中,我們定義的QueryResolver是Manga類型。


import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType
from models import Manga as MangaModel


class MangaFields:
    title = graphene.String(required=True)
    author = graphene.String()
    year = graphene.Int()


class Manga(SQLAlchemyObjectType, MangaFields):
    id = graphene.Int(source='manga_id')

    class Meta:
        model = MangaModel
        interfaces = (graphene.relay.Node, )

class QueryResolver(graphene.ObjectType):
    manga = graphene.Field(lambda: Manga, id=graphene.Int())

    def resolve_manga(self, info, id):
        query = Manga.get_query(info)
        return query.filter_by(manga_id=id).first()

schema = graphene.Schema(query=QueryResolver)

2. 數據模型(Data Model)

由於Provice沒有完全的ORM支持,因此我們需要一個簡單的Manga模型,作為 SQLAlchemy Model ORM 和 Manga GraphQL類型之間互操作的橋樑。讓我們來看一下Manga的模型定義。


from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from settings import DATABASE_URL

engine = create_engine(DATABASE_URL, echo=True)

Base = declarative_base()


class Manga(Base):
    __tablename__ = 'manga'

    manga_id = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)
    author = Column(String, nullable=False)
    year = Column(Integer, nullable=False)

四、Provice API的使用

1. 查詢(Query)

根據id查詢漫畫


query {
    manga(id: 1) {
        id
        title
        author
        year
    }
}

2. 變更(Mutation)

漫畫添加


mutation {
    addManga(title: "Naruto", author: "Masashi Kishimoto", year: 1999) {
        id
        title
        author
        year
    }
}

五、小結

通過以上的介紹,我們對Provice有了更深入的了解。Provice提供了一個基於Python的GraphQL API框架,允許使用者通過自定義Schema和引入適當的解析器對資料庫進行查詢、添加、更新和刪除等操作,從而繞過了ORM的限制和不易調試的限制,充分利用GraphQL強大的靈活性和可視化交互。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236304.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 11:59
下一篇 2024-12-12 11:59

相關推薦

發表回復

登錄後才能評論