23
a first look at postgraphile with railway
PostGraphile builds a GraphQL API from a PostgreSQL schema that automatically detects tables, columns, indexes, relationships, views, types, functions, and comments. It combines PostgreSQL's role-based grant system and row-level security policies with Graphile Engine's GraphQL look-ahead and plugin expansion technologies.
There are two ways to setup a PostgreSQL database with Railway, through the dashboard or through the CLI.
Click dev.new and choose "Provision PostgreSQL" After the database is setup click "PostgreSQL" on the left and then choose "Connect". Copy and paste the PostgreSQL client command.
First you need to install the Railway CLI.
railway version
railway version 0.2.40
If you do not have a Railway account you will be prompted to create one.
railway login
Run the following command, select “Empty Project,” and give your project a name.
railway init
Run the following command and select PostgreSQL to add a plugin to your Railway project.
railway add
railway connect postgresql
psql (13.3, server 13.2)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
railway=#
Run the following SQL commands to create a test table with seed data.
CREATE TABLE Post (title text, body text);
INSERT INTO Post VALUES ('This is a blog post', 'Wooooooo');
INSERT INTO Post VALUES ('Another blog post', 'Even better than the other!');
![](https://res.cloudinary.com/practicaldev/image/fetch/s--OxxAk42Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/93pzypyfryw1oqx5rjt7.png)
\d
List of relations
Schema | Name | Type | Owner
-------------+------+-------+----------
public | post | table | postgres
(1 row)
\d post
Table "public.post"
Column | Type | Collation | Nullable | Default
-------------+------+-----------+----------+---------
title | text | | |
body | text | | |
\q
echo `railway variables get DATABASE_URL` | pbcopy
It is easy to install PostGraphile with npm, although the PostGraphile documentation does not recommend installing PostGraphile globally if you want to use plugins.
npm install -g postgraphile
If you do not globally install you will need to add npx
the beginning of all postgraphile
commands in this tutorial.
railway run postgraphile --watch --enhance-graphiql --dynamic-json --port 5001
Open localhost:5001/graphiql
and send the following query.
![](https://res.cloudinary.com/practicaldev/image/fetch/s--gui29kjN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k67m0nstevn58dh85liy.png)
curl \
--request POST \
--url "http://localhost:5001/graphql" \
--header "Content-Type: application/json" \
--data '{"query":"{ query { allPosts { totalCount nodes { body title } } } }"}'
{
"data":{
"query":{
"allPosts":{
"totalCount":2,
"nodes":[
{
"body":"Wooooooo",
"title":"This is a blog post"
},
{
"body":"Even better than the other!",
"title":"Another blog post"
}
]
}
}
}
}
./ngrok http 5001
Session Status online
Account Anthony Campolo (Plan: Free)
Version 2.3.40
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://363ef1ef5cf3.ngrok.io -> http://localhost:5001
Forwarding https://363ef1ef5cf3.ngrok.io -> http://localhost:5001
Connections ttl opn rt1 rt5 p50 p90
2 0 0.00 0.00 5.11 5.21
Send the same query with your API tool of choice.
![](https://res.cloudinary.com/practicaldev/image/fetch/s--nNPK2jx1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmdadlx9uykt31ie8k4x.png)
23