будет unprepared, так как он таким образом собирается динамически.
Действительно это апи выглядит удобнее базового, однако нужно не забывать о том, что оно заточено под нетипичный юзкейс, когда только в рантайме становится известно, какой запрос надо отправлять, и приходится собирать его динамически. Обычно это нужно всяким абстракциям над БД. Хороший пример: postgrest. Типичные приложения нас же, смертных, в динамическом построении запросов не нуждаются вовсе.
Вот и приходим к дилемме: с одной стороны, как-то неуютно это динамически собирать запросы, которые могли бы быть готовы при компиляции, с другой, уж больно громоздко получается собирать весь запрос и кодеки явным образом с помощью базовой библиотеки "hasql". Поэтому пользователи явно тянутся ко всякого рода хакам. Иными словами, пользователям явно не хватает качественного упрощённого АПИ для написания статических запросов.
После презентации Саши Вершилова для меня это стало очевидным, и я взялся решать эту проблему. В итоге я уже завершаю работу над библиотекой, которая абстрагируется над всей болью объявления стейтментов с помощью квазицитат, попутно доставляя ещё и статическую проверку корректности синтаксиса SQL.
Пример:
selectUserDetails :: Statement Int32 (Maybe (Text, Text, Maybe Text))
selectUserDetails =
[maybeStatement|
select name :: text, email :: text, phone :: text?
from "user"
where id = $1 :: int4
|]
Как оказалось, это достаточно амбициозный проект, и мне-таки пришлось спуститься до фактического портирования оригинального парсера из Postgres. Однако, пока я пишу это сообщение я параллельно наблюдаю, как свойство "парсинг отрендеренного рандомного дерева возвращает то же дерево" уже перевалило 75000 успешных симуляций. Что, по сути, даёт основание быть вполне уверенным в корректности как парсинга, так и рендеринга.
Есть, правда, заметка, что пока что поддерживаются только запросы Select. Однако имплементировать поддержку всего остального уже несложно, так как большую часть дерева синтаксиса я вместе с имплементацией селекта покрыл. Так что ждите хороших новостей скоро.
Те, кому не терпится попробовать библиотеку поскорее, могут установить зависимость на коммит через stack. Вот рабочая ветка проекта:
https://github.com/nikita-volkov/hasql-th/tree/0.3/master
Проблемы прошу рапортовать на трекере проекта либо в личку.
почему бы не использовать собственно сам парсер из postgresql для этого?
Обсуждают сегодня