Как я могу получить esqueleto для создания строки SQL для меня?

Как я могу получить esqueleto для создания строки SQL из инструкции from?

В документации toRawSql говорится, что "вы можете просто включить ведение журнала запросов на постоянный". Я пробовал все возможные формы MonadLogger, которые я мог понять, но никогда не печатал SQL. В той же документации также говорится, что "использование этой функции вручную... возможно, но утомительно". Однако никакие конструкторы типа или любые функции, возвращающие значения типа QueryType, не экспортируются. Мне удалось обойти это, заметив, что QueryType является newtype и использует unsafeCoerce!

Я также был вынужден предоставить Connection (который я получил через SQLite), даже если нет необходимости подключаться к базе данных для генерации SQL.

Это то, что у меня есть. Должен быть лучший способ.

withSqliteConn ":memory:" $
    \conn -> return $ toRawSql SELECT
                               (unsafeCoerce ((const mempty)
                                  :: a -> Text.Lazy.Builder.Builder))
                               (conn, initialIdentState) myFromStatement)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

Ответ 1

За время, прошедшее с момента публикации этого вопроса, esqueleto прошел ряд крупных изменений. Начиная с версия 2.1.2 и нескольких более ранних версий параметр QueryType a, из-за чего ваш unsafeCoerce был удален из toRawSql; что главная бородавка больше не нужна.

Как и в настоящее время, требуется . Я считаю, что, как указано типом имени синонима, IdentInfo, esqueleto использует это для построения идентификаторов в запросе. Он может, например, добавить имя базы данных. На самом деле я на самом деле не нагрянул источник. Достаточно сказать, что передача поддельного соединения (т.е. undefined) не работает; Я не знаю, может ли быть реализовано фиктивное соединение. Ваше решение кажется работоспособным.

Остальное решение должно работать нормально. Поскольку toRawSql явно является внутренней функцией, API здесь представляется разумным. Хотя другие отмечают, что "должно быть" возможно создать строку нейтральной связи, которая выходит за пределы toRawSql.

Вы упомянули, что не можете использовать MonadLogger, как рекомендовано. Что вы пробовали, и что случилось?