Back to Code Snippets
Easy GraphQL QueryingSQL
This uses the http_client and json extensions to create a (relatively) flexible and easy to use GraphQL reader. This only supports POST, but it'd be pretty easy to change to GET. There are parameters to control what and how the results are extracted into a DuckDB table.
Execute this SQL
INSTALL http_client FROM community; LOAD json; LOAD http_client; -- Run a GraphQL query and get back fields with various diagnostics and intermediate values CREATE OR REPLACE MACRO query_graphql(endpoint, query, -- GraphGQL endpoint and query params:=NULL, -- GraphQL parameters headers:=MAP{}, -- HTTP headers (e.g., auth) result_path:='$', -- json_path to use as results result_structure:=NULL, -- json_structure for results or auto detect strict:=true -- Error on failure to transform results ) AS TABLE SELECT response: http_post(endpoint, headers, IF(params IS NULL, {'query': query}, {'query': query, 'params': params})), body: (response->>'body')::JSON, json: body->result_path, structure: IF(result_structure IS NULL, json_structure(json), result_structure), result: IF(strict, from_json_strict(json, structure), from_json(json, structure)); -- Simple helper to extract GraphQL results to a "normal" table CREATE OR REPLACE MACRO read_graphql(endpoint, query, -- Same as above ... params:=NULL, headers:=MAP{}, result_path:='$', result_structure:=NULL, strict:=true, -- ... Same as above unnest_levels:=0 -- Apply unnest this many times to create table ) AS TABLE WITH nested AS ( SELECT [result] AS result FROM query_graphql(endpoint, query, params:=params, headers:=headers, result_path:=result_path, result_structure:=result_structure, strict:=strict) ) SELECT unnest(result, max_depth:=unnest_levels+1) AS result FROM nested; ------------------- Example usage --------------------- FROM read_graphql('https://rickandmortyapi.com/graphql', $$ query Query($name: String) { characters(page: 2, filter: {name: $name}) { info { count } results { id name gender } } } $$, params:={'name': 'Morty'}, result_path:='$.data.characters.results', result_structure:=[{id:'int',name:'string',gender:'string'}], unnest_levels:=2 ); -- Example Results ------------------ -- ┌─────────┬────────────────────┬─────────┐ -- │ id │ name │ gender │ -- │ int32 │ varchar │ varchar │ -- ├─────────┼────────────────────┼─────────┤ -- │ 21 │ Aqua Morty │ Male │ -- ... -- ├─────────┴────────────────────┴─────────┤ -- │ 20 rows 3 columns │ -- └────────────────────────────────────────┘
Copy code
Teague Sterling
Expand
Share link