1. 程式人生 > >Hasura GraphQL schema 生成是如何工作的

Hasura GraphQL schema 生成是如何工作的

不像大部分的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