GraphQL for Postgres
PLpgSQL
Switch branches/tags
Nothing to show
Clone or download
Permalink
Failed to load latest commit information.
fb Fix escaping issue. Mar 13, 2015
LICENSE Shift to PostgreSQL license. Mar 15, 2015
README.md Roadmap Mar 23, 2015
demo.sql Clear table label at the end of the demo. Mar 21, 2015
graphql.sql Use both args in string format Mar 30, 2017

README.md

GraphpostgresQL -- a graph interface to relational data

GraphpostgresQL is inspired by Facebook's graphql. By using table introspection, GraphpostgresQL is able to follow foreign keys and index into complex datatypes like json, jsonb and hstore.

A Proof of Concept

GraphpostgresQL is alpha quality and has undergone neither extensive optimization nor comprehensive testing. To use it for production workloads would needlessly tempt fate.

Install GraphpostgresQL

Using psql, load the graphql schema file:

\i graphql.sql

All definitions are created under the graphql schema. GraphpostgresQL doesn't load any extensions or alter the search_path. If an older version of GraphpostgresQL is loaded, the new installation will overwrite it.

Using GraphpostgresQL

To generate a query, use graphql.to_sql(text):

SELECT graphql.to_sql($$
  user("f3411edc-e1d0-452a-bc19-b42c0d5a0e36") {
    full_name,
    friendship
  }
$$);

Which should result in something like:

SELECT to_json("sub/2") AS "user"
  FROM "user",
       LATERAL (
         SELECT json_agg("user") AS friendship
           FROM "user"
           JOIN friendship ON (("user".id) = (friendship.second))
          WHERE (friendship.first)
              = ('f3411edc-e1d0-452a-bc19-b42c0d5a0e36'::uuid)
       ) AS "sub/1",
       LATERAL (
         SELECT "user".full_name, "sub/1".friendship
       ) AS "sub/2"
 WHERE (("user".id) = ('f3411edc-e1d0-452a-bc19-b42c0d5a0e36'::uuid))

To run a query, use graphql.run(text) instead of graphql.to_sql(text).

Removing GraphpostgresQL

It's easy to remove GraphpostgresQL:

DROP SCHEMA IF EXISTS graphql CASCADE;

Roadmap

In GraphpostgresQL64, we'll introduce expanded selectors (nested selection in JSON columns, for example), an interface that accepts keyword parameters, and the ability to store and re-execute queries.

In GraphpostgresQL3D, we'll introduce a PL/V8 implementation, with extensible parsing, hooks and overall more modular implementation.