Hasura GraphQL schema 生成是如何工作的
阿新 • • 發佈:2018-11-13
不像大部分的graphql 引擎,使用標準的graphql 規範的處理模型,Hasura graphql 不存在resolver 的概念(實際上是有的,只是轉換為了sql語法)
以下是Hasura graphql 引擎的內幕
表的處理
假設有一張表 profile(id,name) 需要暴露為graphql api ,以下是Hasura 的處理方式
- 根據表生成一個graphql 型別(type)
- 根據表生成聚合函式的graphql 型別
- 同時還會生成關係聚合函式的資料型別
- 生成查詢引數 where、order_by limit offset (input 引數)
- 生成支援批量insert 以及upsert 的突變
- 生成支援更新的突變
- 生成刪除條件的突變
檢視的處理
檢視與表類似,支援不會生成突變操作
關係或者連線
包含表與表、表與檢視、檢視與檢視的關係,操作根據配置的關係生成對於的型別以及input 引數
你可定物件關係(類似一對一),陣列關係(一對多)
如下:
- 你可能有一個關係restaurant.average_rating 其中average_rating 是一個檢視通過restaurant_id
與restaurant 表進行關聯
- 你可能有一個user.addresses 其中每一個使用者包含多地址的連線
對於以上的管理,graphql 的處理方式
- 新增巢狀型別的引用來擴充套件涉及的表以及檢視型別
- 增加使用者巢狀的過濾 where order_by
- 增加巢狀型別的聚合函式的資料型別
resolver
Hasura 引擎沒有任何的解析器,引擎實際上是一個編譯器,將graphql 查詢編譯為sql 查詢
Hasura 的graphql 語法是經過優化的,新的版本包含了一個分析的按鈕,可以清晰的看出處理
元資料
Hasura 將特定的元資料儲存在pg 資料庫中,對於一些常見的問題,我們可以通過調整資料庫來處理,
實際上新的版本已經支援了reset 的功能
參考資料
https://docs.hasura.io/1.0/graphql/manual/schema/how-it-works.html