PostgREST – открытый веб-сервер, который позволяет превратить любую базу данных, хранимую в СУБД PostgreSQL, в полноценный RESTful API. Мотивацией к написанию PostgREST стало желание уйти от ручного программирования CRUD, так как это может привести к проблемам: написание бизнес-логики часто дублирует, игнорирует или усложняет структуру базы данных; объектно-реляционное отображение (ORM mapping) не надёжная абстракция, которая приводит к медленному императивному коду и может стать причинной проблем с безопасностью. PostgREST написан на языке Haskell и распространяется по лицензии MIT.
Философия PostgREST в декларативном доступе к данным, без лишних прослоек. PostgREST не использует ORM, все представления создаются прямо в базе данных. Чтобы создавать и поддерживать backend API с PostgREST достаточно иметь в штате администратора СУБД. PostgREST упрощает разработку бэкенда и позволяет объединять, экстрагировать и фильтровать данные через запрос. Вместо написания кода в контроллерах (controllers) можно просто назначить разрешения для объектов в базе данных, а вместо того чтобы писать многочисленные проверки можно напрямую установить ограничения в базе данных.
Несколько иллюстраций возможностей PostgREST:
curl https://localhost:3000/todos [ { “id”: 1, “done”: false, “task”: “finish tutorial 0”, “due”: null }, { “id”: 2, “done”: false, “task”: “pat self on back”, “due”: null }] curl https://localhost:3000/todos -X POST \ -H “Content-Type: application/json” \ -d ‘{“task”: “do bad thing”}’ { “hint”: null, “details”: null, “code”: “42501”, “message”: “permission denied for relation todos” } GET /films?select=title,directors(id,last_name) HTTP/1.1 [ { “title”: “Workers Leaving The Lumière Factory In Lyon”, “directors”: { “id”: 2, “last_name”: “Lumière” } }, { “title”: “The Dickson Experimental Sound Film”, “directors”: { “id”: 1, “last_name”: “Dickson” } }, { “title”: “The Haunted Castle”, “directors”: { “id”: 3, “last_name”: “Méliès” } }]
Для PostgREST есть клиентские библиотеки и расширения, в том числе для OAth, Websockets, Amazon Kinesis. Также доступен starter-kit, который работает в Docker и включает PostgREST, веб-сервер openresty на Lua, pgTAP, RabbitMQ и панель управления.
Запустить приложения на PostgREST можно на платформе Heroku, так же используя Docker. Ещё есть профильная облачная платформа с расширенными функциями, subzero, разработчики которой развивают форк PostgREST+, в котором реализованы агрегатные и оконные функции, а также репликация на чтение.