2013-12-07 3 views
85

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

В документации 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

+2

Я считаю, что причина, по которой вам нужно дать ему соединение, заключается в том, что он является полиморфным в базе данных и использует выведенные экземпляры 'SqlPersist' для генерации строк SQL, специфичных для баз данных. – Thomas

+2

Однако соединение и тип базовой базы данных - это разные вещи. Должна быть возможность генерировать строку SQL чисто. –

ответ

2

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

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

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

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

+0

Я не могу вспомнить, что я пытался с помощью «MonadLogger», к сожалению. Это было довольно давно. –

+0

У вас случайно есть тестовый проект, чтобы увидеть, работает ли 'toRawSql' для использования в этом случае? Я настроил среду 'esqueleto', чтобы попробовать, но у меня не было времени выяснить, что« постоянный »и все другие механизмы фактически создают и потребляют реальный запрос. –

+0

У меня нет какой-либо тестовой среды или каких-либо проектов esqueleto вообще, извините. –

 Смежные вопросы

  • Нет связанных вопросов^_^