Обсуждаем PostgREST — open source веб-сервер на Haskell

    Рассказываем об инструменте, который позволяет настроить API для работы с запросами PostgreSQL. Говорим о возможностях, достоинствах и недостатках утилиты, а также об альтернативных решениях.


    Фото — Campaign Creators — Unsplash

    Что такое PostgREST


    Это — веб-сервер с открытым исходным кодом для работы с базой данных PostgreSQL по API. По словам авторов, решение представляет собой альтернативу ручному CRUD-программированию. С его помощью не нужно писать бизнес-логику, усложняющую структуру БД, и заниматься объектно-реляционным отображением (ORM mapping), что приводит к появлению императивного кода.

    PostgREST написан на Haskell, распространяется по свободной лицензии и имеет обширное сообщество — поддержку по продукту можно получить в gitter-чате. Сегодня веб-сервер активно используют в продакшн такие проекты, как аналитический инструмент от Oracle — Moat, e-commerce платформа iAdvize и система для формирования графиков по URL Image-charts.

    Также для PostgREST разработаны расширения под OAuth, websocket и nginx.

    Немного о возможностях


    Система способна обрабатывать запросы ко всем представлениям и таблицам схемы БД. Например, для получения данных из таблицы people достаточно сформировать следующую команду:

    GET /people HTTP/1.1

    Помимо GET, среди ключевых слов можно выделить: OPTIONS, POST, PATCH и DELETE. Все они учитывают права доступа при работе с данными. Запрос к таблице, для обращения к которой у пользователя недостаточно полномочий, будет отклонен. В официальной документации есть соответствующий пример. БД получает 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, PL/Python или PLV8. Готовые процедуры можно вызывать с помощью POST /rpc/procedure_name (при передаче именованных параметров) или GET /rpc/procedure_name (при работе с GET-параметрами).

    Что об инструменте думает сообщество


    Есть мнение, что система PostgREST легковесна и нетребовательна к ресурсам (с шестью инстансами расход памяти редко превышает 70 Мбайт, в то время как для связки Node.js/Waterline эта цифра вырастает до одного гигабайта). Аналогичную точку зрения высказал резидент Hacker News и отметил, что PostgREST — это первый инструмент на Haskell, который он развернул в продакшн.


    Фото — Neringa Šidlauskaitė — Unsplash

    Но есть в комьюнити и те, кто критикует PostgREST. Один из пользователей заметил, что код на Haskell сложно читать, поэтому отладка подобных библиотек в продакшн-среде может вызывать затруднения. При этом инструмент, по сути, передает задачи по обработке бизнес-логики от бэкенда базе данных — так поступали более десяти лет назад. В связи с этим есть мнение, что вместо PostgREST лучше писать ограничения (constraints) на обычном SQL.

    Другой пользователь с HN говорит, что веб-сервер пригоден лишь для развертки временных и высокопроизводительных приложений. В долгосрочной перспективе могут возникнуть сложности со структурой базы данных — схема БД становится API-схемой, а для неё нужно строить отдельные представления.

    Какие есть аналоги


    PostgREST не единственный веб-сервер, который позволяет работать с базами данных по API. Например, есть Hasura — легковесный GraphQL-сервер, который играет роль посредника между веб-приложением и PostgreSQL. Система сгенерирует GraphQL-схему на основе существующей базы данных или создаст новую. Также она дружит с GraphQL Subscriptions, осуществляет динамический контроль прав доступа и автоматическую генерацию запросов на объединение таблиц.

    Сегодня Hasura используют многие компании — в том числе из списка Fortune 500. И у системы есть интеграции с облачными платформами крупнейших западных IaaS-провайдеров.

    Еще можно отметить Prisma — сервис тоже призван заменить традиционные ORM. Но в отличие от PostgREST и Hasura решение работает сразу с несколькими базами данных — PostgreSQL, MySQL и MongoDB. В результате пользователи получают гибкий инструмент, однако это сказывается на его функциональности. Например, в Prisma меньше способов управления бизнес-логикой. Но учитывая, что инструмент активно поддерживают (у него более 16 тыс. звезд на GitHub), стоит ждать улучшений.


    Мы в 1cloud предлагаем услугу «Облачное объектное хранилище». Оно подойдет для резервных копий, архивных данных, а также обмена корпоративными документами.

    Стоимость аренды складывается из двух составляющих: мы учитываем объемы хранимых данных и исходящего трафика.


    Дополнительное чтение из корпоративного блога 1cloud.ru:

    Как сэкономить с помощью прикладного программного интерфейса (API)
    Как IaaS помогает франчайзи «1С»: опыт 1cloud
    Как разработчики приложений используют виртуальный контейнер?


    • +13
    • 4,1k
    • 4
    1cloud.ru
    175,19
    IaaS, VPS, VDS, Частное и публичное облако, SSL
    Поделиться публикацией

    Комментарии 4

      +2
      Есть еще один инструмент, с похожей функциональностью — PostGraphile. Было бы интересно почитать про сравнение возможностей этих утилит
        +1

        Open API vs graphql… вот и все отличие. Если не считать, что postgraphile легко расширять на js, который не знает только ленивый.


        У меня в проде оба.

          0
          было бы интересно посмотреть/прочитать про обвязку и архитектуру системы, где эти системы в проде
            0

            Я пару раз пытался писать статьи — сложно читать.


            Большая часть для внутренних интерфейсов (админки к примеру). Эти инструменты отлично закрывают CRUD и сбоку (не важно как) дописывается апи для сложных запросов (обычно мутации или внешние апи).


            Вообще они очень сильно опираются на grant/row level security/roles в pg. За три года опыта работы с ними дошел до мысли, что можно просто сделать http api, которое принимает sql, params, JWT и просто его выполняет (кое где уже начал тестировать, т.е. "select id, title from products" на фронте, особо не отличается в этом смысле от query { products { id, title } } или /posts?select=id,title). У postgresql и postgraphile единственный плюс — это готовая кодогенерация (самого кода или доки) из схем.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое