- PVSM.RU - https://www.pvsm.ru -
Рассказываем об инструменте, который позволяет настроить API для работы с запросами PostgreSQL. Говорим о возможностях, достоинствах и недостатках утилиты, а также об альтернативных решениях.
[1]
Фото — Campaign Creators [2] — Unsplash
Это — веб-сервер с открытым исходным кодом [3] для работы с базой данных PostgreSQL по API. По словам авторов, решение — альтернатива ручному CRUD [4]-программированию. С его помощью не нужно писать бизнес-логику, усложняющую структуру БД, и заниматься объектно-реляционным отображением (ORM mapping), что приводит к появлению медленного императивного кода [5].
PostgREST написан на Haskell, распространяется по свободной лицензии [6] и имеет обширное сообщество — поддержку по продукту можно получить в gitter-чате [7]. Сегодня веб-сервер активно используют [8] в продакшн такие проекты, как аналитический инструмент от Oracle — Moat, e-commerce платформа iAdvize и система для формирования графиков по URL Image-charts.
Также для PostgREST разработаны расширения под OAuth [9], websocket [10] и nginx [11].
Система способна обрабатывать запросы ко всем представлениям и таблицам схемы БД. Например, для получения данных из таблицы people достаточно сформировать следующую команду:
GET /people HTTP/1.1
Помимо GET, среди ключевых слов можно выделить: OPTIONS, POST, PATCH и DELETE. Все они учитывают права доступа при работе с данными. Запрос к таблице, для обращения к которой у пользователя недостаточно полномочий, будет отклонен. В официальной документации есть соответствующий пример [12]. БД получает API-запрос на добавление новой задачи в таблицу todo:
curl http://localhost:3000/todos -X POST
-H "Content-Type: application/json"
-d '{"task": "do bad thing"}'
В ответ PostgREST генерирует отказ:
{
"hint": null,
"details": null,
"code": "42501",
"message": "permission denied for relation todos"
}
Веб-сервер также поддерживает хранимые процедуры. Их пишут на языке PL/pgSQL [13], PL/Python [14] или PLV8. Готовые процедуры можно вызывать с помощью POST /rpc/procedure_name (при передаче именованных параметров) или GET /rpc/procedure_name (при работе с GET-параметрами).
Есть мнение [15], что система PostgREST легковесна и нетребовательна к ресурсам (например, с шестью инстансами расход памяти редко превышает 70 Мбайт, в то время как для связки Node.js/Waterline эта цифра вырастает до одного гигабайта). Аналогичная точка зрения прозвучала [16] и на Hacker News. Резидент площадки рассказал, что PostgREST — это первый инструмент на Haskell, который он развернул в продакшн. Но есть и те, кто критикует PostgREST.
Фото — Neringa Šidlauskaitė [17] — Unsplash
Один из пользователей заметил [18], что код на Haskell сложно читать [19], поэтому отладка подобных библиотек в продакшн-среде может вызывать затруднения. При этом инструмент, по сути, передает [20] задачи по обработке бизнес-логики от бэкенда базе данных — так поступали более десяти лет назад. И есть мнение, что вместо PostgREST лучше писать ограничения (constraints) на обычном SQL.
Другой пользователь HN говорит [21], что веб-сервер пригоден лишь для развертки временных и высокопроизводительных приложений. В перспективе могут возникнуть сложности со структурой базы данных — схема БД становится API-схемой, а для неё нужно строить отдельные представления.
PostgREST не единственный веб-сервер, который позволяет работать с базами данных по API. Например, есть Hasura [22] — легковесный GraphQL-сервер, который играет роль посредника между веб-приложением и PostgreSQL. Система сгенерирует GraphQL-схему на основе существующей базы данных или создаст новую. Также она дружит с GraphQL Subscriptions [23], осуществляет динамический контроль прав доступа и автоматическую генерацию запросов на объединение таблиц.
Сегодня Hasura используют многие компании — в том числе [24] из списка Fortune 500. И у системы есть интеграции с облачными платформами крупнейших западных IaaS-провайдеров.
Еще можно отметить Prisma [25] — сервис тоже призван заменить традиционные ORM. Но в отличие от PostgREST и Hasura дружит сразу с несколькими базами данных — PostgreSQL, MySQL и MongoDB. В результате пользователи получают гибкий инструмент, однако это сказывается [26] на его функциональности. Например, в Prisma меньше возможностей для работы с бизнес-логикой. Но инструмент активно поддерживают (у него более 16 тыс. звезд [27] на GitHub), поэтому стоит ждать обновлений и улучшений.
Как сэкономить с помощью прикладного программного интерфейса (API) [30]
Как IaaS помогает франчайзи «1С»: опыт 1cloud [31]
Как разработчики приложений используют виртуальный контейнер? [32]
Автор: 1cloud
Источник [33]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/api/338394
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/1cloud/blog/478156/
[2] Campaign Creators: https://unsplash.com/photos/IKHvOlZFCOg
[3] открытым исходным кодом: https://github.com/PostgREST/postgrest
[4] CRUD: https://ru.wikipedia.org/wiki/CRUD
[5] императивного кода: https://ru.wikipedia.org/wiki/%D0%98%D0%BC%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5
[6] по свободной лицензии: https://github.com/PostgREST/postgrest/blob/master/LICENSE
[7] gitter-чате: https://gitter.im/begriffs/postgrest
[8] используют: https://postgrest.org/en/v4.3/intro.html#ecosystem
[9] OAuth: https://github.com/svmnotn/postgrest-auth
[10] websocket: https://github.com/diogob/postgres-websockets
[11] nginx: https://github.com/ppKrauss/PostgREST-writeAPI
[12] есть соответствующий пример: https://postgrest.org/en/v6.0/tutorials/tut0.html
[13] PL/pgSQL: https://ru.wikipedia.org/wiki/PL/pgSQL
[14] PL/Python: https://ru.wikipedia.org/wiki/PL/Python
[15] мнение: https://postgrest.org/en/v4.3/intro.html#testimonials
[16] прозвучала: https://news.ycombinator.com/item?id=21435644
[17] Neringa Šidlauskaitė: https://unsplash.com/photos/XncszFVfqhE
[18] заметил: https://news.ycombinator.com/item?id=21445878
[19] сложно читать: https://github.com/PostgREST/postgrest/blob/master/test/Main.hs
[20] по сути, передает: https://news.ycombinator.com/item?id=21439230
[21] говорит: https://news.ycombinator.com/item?id=21435962
[22] Hasura: https://github.com/hasura/graphql-engine
[23] GraphQL Subscriptions: https://github.com/apollographql/graphql-subscriptions
[24] в том числе: https://hasura.io/use-cases
[25] Prisma: https://github.com/prisma/prisma
[26] сказывается: https://blog.hasura.io/hasura-vs-prisma-9ffc7271eda8/
[27] более 16 тыс. звезд: https://github.com/prisma/prisma/stargazers
[28] Облачное объектное хранилище: https://1cloud.ru/services/storage?utm_source=habrahabr&utm_medium=cpm&utm_campaign=postgrest&utm_content=site
[29] складывается: https://1cloud.ru/conditions/paymentrule?utm_source=habrahabr&utm_medium=cpm&utm_campaign=postgrest&utm_content=site
[30] Как сэкономить с помощью прикладного программного интерфейса (API): https://1cloud.ru/blog/ekonomiya-na-api?utm_source=habrahabr&utm_medium=cpm&utm_campaign=postgrest&utm_content=blog
[31] Как IaaS помогает франчайзи «1С»: опыт 1cloud: https://1cloud.ru/blog/kak-iaas-pomogaet-1c-franchisee?utm_source=habrahabr&utm_medium=cpm&utm_campaign=postgrest&utm_content=blog
[32] Как разработчики приложений используют виртуальный контейнер?: https://1cloud.ru/blog/virtualnyj-kontejner-prilozhenija?utm_source=habrahabr&utm_medium=cpm&utm_campaign=postgrest&utm_content=blog
[33] Источник: https://habr.com/ru/post/478156/?utm_source=habrahabr&utm_medium=rss&utm_campaign=478156
Нажмите здесь для печати.