如何从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
答案 0 :(得分:2)
自发布此问题以来,esqueleto
已进行了多项重大修订。自version 2.1.2以及若干早期版本起,QueryType a
所需的unsafeCoerce
参数已从toRawSql
中移除;那个主要的疣就不再需要了。
目前已实施,需要Connection
。我相信,正如类型同义词名称IdentInfo
所示,esqueleto
使用它来在查询中构建标识符。例如,它可以添加数据库名称。我还没有足够深入地探测源头。我只想说,通过假连接(即undefined
)并不起作用;我不知道是否可以实现模拟连接。你的解决方案似乎可行。
你的解决方案的其余部分应该可以正常工作。由于toRawSql
明确是一个内部函数,因此这里的API似乎是合理的。虽然其他人注意到它应该"可以生成一个连接中性字符串,它出现在toRawSql
范围之外。
您提到您无法按照建议使用MonadLogger
。你尝试了什么,发生了什么?