169 похожих чатов

Всё верно понял. Там иплицитные энкодеры подсасываются через тайпклассы. Запрос всегда

будет 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

Проблемы прошу рапортовать на трекере проекта либо в личку.

1 ответов

14 просмотров

почему бы не использовать собственно сам парсер из postgresql для этого?

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
15
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта