Tutorial 0 - Get It Running - PostgREST 12.2 Documentation
Tutorial 0 - Get It Running - PostgREST 12.2 Documentation
Welcome to PostgREST! In this pre-tutorial we’re going to get things running so you can
create your first simple API.
PostgREST is a standalone web server which turns a PostgreSQL database into a RESTful API.
It serves an API that is customized based on the structure of the underlying database.
To make an API we’ll simply be building a database. All the endpoints and permissions come
from database objects like tables, views, roles, and functions. These tutorials will cover a
number of common scenarios and how to model them in the database.
By the end of this tutorial you’ll have a working database, PostgREST server, and a simple
single-user todo list API.
If you’re already familiar with using PostgreSQL and have it installed on your system you can
use the existing installation (see Supported PostgreSQL versions for minimum requirements).
For this tutorial we’ll describe how to use the database in Docker because database
configuration is otherwise too complicated for a simple tutorial.
If Docker is not installed, you can get it here. Next, let’s pull and start the database image:
This will run the Docker instance as a daemon and expose port 5432 to the host system so
that it looks like an ordinary PostgreSQL server to the rest of the system.
Note
This only works if there is no other PostgreSQL instance running on the default port on
your computer. If this port is already in use, you will receive a message similar to this:
docker: Error response from daemon: [...]: Bind for 0.0.0.0:5432 failed: port is already
allocated.
In this case, you will need to change the first of the two 5432 to something else, for
example to 5433:5432 . Remember to also adjust the port in your config file in Step 5!
postgrest -h
It should print the help page with its version and the available options.
PostgREST is also distributed as a single binary, with versions compiled for major
distributions of macOS, Windows, Linux and FreeBSD. Visit the latest release for a list of
downloads. In the event that your platform is not among those already pre-built, see Building
from Source for instructions how to build it yourself. Also let us know to add your platform in
the next release.
The pre-built binaries for download are .tar.xz compressed files (except Windows which is
a zip file). To extract the binary, go into the terminal and run
The result will be a file named simply postgrest (or postgrest.exe on Windows). At this point
try running it with
./postgrest -h
If everything is working correctly it will print out its version and the available options. You
can continue to run this binary from where you downloaded it, or copy it to a system
directory like /usr/local/bin on Linux so that you will be able to run it from any directory.
Note
Ubuntu or Debian
Fedora, CentOS, or Red Hat
macOS
Windows
Connect to the SQL console (psql) inside the container. To do so, run this from your
command line:
psql (16.2)
Type "help" for help.
postgres=#
The first thing we’ll do is create a named schema for the database objects which will be
exposed in the API. We can choose any name we like, so how about “api.” Execute this and
the other SQL statements inside the psql prompt you started.
Our API will have one endpoint, /todos , which will come from a table.
Next make a role to use for anonymous web requests. When a request comes in, PostgREST
will switch into this role in the database to run queries.
The web_anon role has permission to access things in the api schema, and to read rows in
the todos table.
It’s a good practice to create a dedicated role for connecting to the database, instead of using
the highly privileged postgres role. So we’ll do that, name the role authenticator and also
grant it the ability to switch to the web_anon role :
\q
Step 4. Run PostgREST
PostgREST can use a configuration file to tell it how to connect to the database. Create a file
tutorial.conf with this inside:
db-uri = "postgres://authenticator:mysecretpassword@localhost:5432/postgres"
db-schemas = "api"
db-anon-role = "web_anon"
The configuration file has other options, but this is all we need. If you are not using Docker,
make sure that your port number is correct and replace postgres with the name of the
database where you added the todos table.
Note
In case you had to adjust the port in Step 2, remember to adjust the port here, too!
It’s now ready to serve web requests. There are many nice graphical API exploration tools
you can use, but for this tutorial we’ll use curl because it’s likely to be installed on your
system already. Open a new terminal (leaving the one open that PostgREST is running inside).
Try doing an HTTP request for the todos.
curl http://localhost:3000/todos
The API replies:
[
{
"id": 1,
"done": false,
"task": "finish tutorial 0",
"due": null
},
{
"id": 2,
"done": false,
"task": "pat self on back",
"due": null
}
]
With the current role permissions, anonymous requests have read-only access to the todos
{
"code": "42501",
"details": null,
"hint": null,
"message": "permission denied for table todos"
}
There we have it, a basic API on top of the database! In the next tutorials we will see how to
extend the example with more sophisticated user access controls, and more tables and
queries.
Now that you have PostgREST running, try the next tutorial, Tutorial 1 - The Golden Key