Как я могу заставить 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
SqlPersist
экземпляры для генерации строк SQL, специфичных для базы данных.Ответы:
За время,
esqueleto
прошедшее с момента публикации этого вопроса, он претерпел ряд серьезных изменений. Начиная с версии 2.1.2 и нескольких более ранних версий,QueryType a
параметр, который требовал вашегоunsafeCoerce
, был удален изtoRawSql
; эта большая бородавка больше не нужна.В текущей реализации
Connection
требуется. Я считаю , что, как указано имя синоним типа,IdentInfo
,esqueleto
использует это , чтобы идентификаторы сборки в запросе. Например, он может добавить имя базы данных. Я действительно не изучил источник достаточно глубоко. Достаточно сказать, что передача поддельного соединения (т.е.undefined
) не работает; Я не знаю, можно ли реализовать фиктивное соединение. Ваше решение кажется работоспособным.Остальная часть вашего решения должна работать нормально. Поскольку
toRawSql
это явно внутренняя функция, API здесь кажется разумным. Хотя другие отмечают, что «должно быть» возможно сгенерировать строку, не зависящую от соединения, это выходит за рамкиtoRawSql
.Вы упомянули, что не можете использовать
MonadLogger
как рекомендовано. Что вы пробовали и что вышло?источник
MonadLogger
сожалению, не могу вспомнить, что пробовал . Это было довольно давно.toRawSql
работает ли сейчас для варианта использования этого вопроса? Я настроилesqueleto
среду, чтобы опробовать его, но у меня не было времени разобраться,persistent
а все остальное оборудование действительно построило и обработало реальный запрос.