Before we jump to the action, I want to present our main actors.
PostgREST is a standalone web server that turns your PostgreSQL database directly into a RESTful API. The structural constraints and permissions in the database determine the API endpoints and operations.
Yugabyte it's a NewSQL database. Combines the strength of both worlds, ACID default support and horizontal scalability. In their words "Modern applications need a cloud-native database that eliminates tradeoffs and silos. The world's leading enterprises are modernizing from Oracle, SQL Server, DB2 and other legacy RDBMSs to YugabyteDB for mission-critical applications."
First, we need to spin up our Yugabyte. The easiest way to do this is using a dockerfile.
version: '2'
services:
db:
image: yugabytedb/yugabyte:latest
user: root
command: "bin/yugabyted start --daemon=false"
ports:
- "7000:7000"
- "9000:9000"
- "5433:5433"
- "9042:9042" # live chat
restart: always # run as a service
volumes:
- /yb_data:/home/yugabyte/yb_data
Then, we are going to configure the DB for the testing
--Create schema
create schema api;
-- CreateTable and dummy values to test
create table api.todos (
id serial primary key,
done boolean not null default false,
task text not null,
due timestamptz
);
insert into api.todos (task) values
('finish tutorial 0'), ('pat self on back');
--Create an user and configure all the required grantees
create role web_anon nologin;
grant usage on schema api to web_anon;
grant select on api.todos to web_anon;
create role authenticator noinherit login password 'mysecretpassword';
grant web_anon to authenticator;
After that, we need to configure our postREST to connect to our local Yugabyte container. We will use the Yugabyte DB and the user/password created in the previous step.
db-uri = "postgres://authenticator:mysecretpassword@localhost:5433/yugabyte"
db-schemas = "api"
db-anon-role = "web_anon"
And we start the web server
Then, we can run our docker file
docker-compose up
now, we have a RESTful API to consume our data.
postgres@MSI:/home/felipe$ curl http://localhost:3000/todos
[{"id":1,"done":false,"task":"finish tutorial 0","due":null},
{"id":2,"done":false,"task":"pat self on back","due":null}]
postgres@MSI:/home/felipe$
Or by web
In the next article, we will see how to add other operations PUT/POST/DELETE
Thanks for reading