1. 程式人生 > 實用技巧 >cratedb 整合graphjin 嘗試(木有成功)

cratedb 整合graphjin 嘗試(木有成功)

graphjin 是一個很不錯的graphql engine(library),因為cratedb 相容pg協議,所以以下是一個簡單的
整合嘗試

環境準備

  • cratedb 環境
version: "3"
services: 
 db:
  image: dalongrong/cratedb:4.4.0
  ports:
  - "4200:4200"
  - "4300:4300"
  - "5432:5432"
  • golang 整合
    main.go
package main
import (
  "context"
  "database/sql"
  "fmt"
  "log"
  "github.com/dosco/graphjin/core"
  _ "github.com/jackc/pgx/v4/stdlib"
)
func main() {
  db, err := sql.Open("pgx", "postgres://crate:@localhost:5432/doc")
  if err != nil {
    log.Fatal(err)
   }
  sg, err := core.NewGraphJin(nil, db)
  if err != nil {
    log.Fatal(err)
   }
  query := `
  query {
    demoapps{
     id
     full_name
     email
    }
   }`
  ctx := context.Background()
  ctx = context.WithValue(ctx, core.UserIDKey, 1)
  res, err := sg.GraphQL(ctx, query, nil)
  if err != nil {
    log.Fatal(err)
   }
  fmt.Println(string(res.Data))
}

環境初始化

  • 建立table&&寫入資料(使用admin)
docker-compose up -d
create table demoapp(id int ,name string, age int);
insert into demoapp(id,name,age) values(3,'dalong',3444);
  • 執行(沒有通過)
go run main.go
  • 幾個問題

INF attribute based access control disabled: roles_query not set
2021/01/10 18:52:17 error fetching columns: ERROR: line 3:20: no viable alternative at input 'SELECT \n\tcol.table_name as table' (SQLSTATE XX000)

通過程式碼除錯返現以下問題:
core/core.go 對於處理列有問題,嘗試的修改(sql,core/internal/sdata/sql.go)
主要是資料型別處理,以及引號問題

SELECT 
  col.table_name as "table",
  col.column_name as "name",
  col.data_type as "type",
   (CASE
    WHEN col.is_nullable = TRUE THEN TRUE 
    ELSE FALSE
  END) AS notnull,
   (CASE
    WHEN col.data_type = 'ARRAY' THEN TRUE 
    ELSE FALSE
  END) AS isarray,
   (CASE
    WHEN tc.constraint_type = 'PRIMARY KEY' THEN TRUE 
    ELSE FALSE
  END) AS primarykey,
   (CASE 
    WHEN tc.constraint_type = 'UNIQUE' THEN TRUE
    ELSE FALSE
  END) AS uniquekey,
   (CASE
    WHEN tc.constraint_type = 'FOREIGN KEY' THEN ccu.table_schema
    ELSE ''
  END) AS foreignkey_schema,
   (CASE
    WHEN tc.constraint_type = 'FOREIGN KEY' THEN ccu.table_name
    ELSE ''
  END) AS foreignkey_table,
   (CASE
    WHEN tc.constraint_type = 'FOREIGN KEY' THEN ccu.column_name
    ELSE ''
  END) AS foreignkey_column
FROM 
  information_schema.columns col
LEFT JOIN 
  information_schema.key_column_usage kcu ON col.table_schema = kcu.table_schema
   AND col.column_name = kcu.column_name
LEFT JOIN 
  information_schema.table_constraints tc ON kcu.table_schema = tc.table_schema
  AND kcu.constraint_name = tc.constraint_name
LEFT JOIN 
  information_schema.key_column_usage ccu ON tc.constraint_schema = ccu.constraint_schema
  AND ccu.constraint_name = tc.constraint_name
WHERE 
  col.table_schema NOT IN ('information_schema', 'pg_catalog')
ORDER BY 
  col.ordinal_position

INF attribute based access control disabled: roles_query not set
2021/01/10 15:18:09 Error fetching functions: ERROR: Relation 'information_schema.parameters' unknown (SQLSTATE 42P01)
cratedb 就不存在information_schema.parameters 記憶體表(graphjin 主要是進行函式的處理)
解決方法:
註釋關於function 的處理 core/internal/sdata/tables.go

cratedb-graphjin go run main.go
INF attribute based access control disabled: roles_query not set
2021/01/10 15:24:17 ERROR: line 1:119: no viable alternative at input 'SELECT jsonb_build_object('demoapps', __sj_0.json) AS __root FROM (VALUES(true)) AS __root_x LEFT OUTER JOIN LATERAL (SELECT' (SQLSTATE XX000)
此問題主要是cratedb對於jsonb 的支援問題,當然解決方法也是有的,我們可以通過自定義函式解決
目前從sql 編譯的來看,對於jsonb 的支援需要好幾個函式,後邊研究好了,嘗試提供提供相關的自定義函式

說明

cratedb client 相容性,但是因為graphjin使用了json的處理,但是cratedb 沒有json 的直接支援,所有就有問題了,從套路上
graphjin 的處理特別類似hasura(基於了jsonb 的處理能力)

參考資料

https://crate.io/docs/crate/clients-tools/en/latest/
https://github.com/jackc/pgx
https://github.com/dosco/graphjin/blob/master/core/core.go#L70
https://crate.io/docs/crate/reference/en/4.3/general/information-schema.html#information-schema
https://crate.io/docs/crate/reference/en/4.3/admin/system-information.html#system-information