如何让esqueleto为我生成一个SQL字符串?

时间:2013-12-07 00:07:14

标签: haskell yesod esqueleto

如何从from语句生成esqueleto以生成SQL字符串?

toRawSql的文档说“你可能只是打开持久性的查询记录”。我尝试了所有可能的MonadLogger形式,但我从未打印过任何SQL。同样的文档也说“手动使用这个功能......可能但很乏味”。但是,不会导出类型的构造函数,也不会导出返回类型QueryType的值的任何函数。通过注意QueryTypenewtype并使用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 个答案:

答案 0 :(得分:2)

自发布此问题以来,esqueleto已进行了多项重大修订。自version 2.1.2以及若干早期版本起,QueryType a所需的unsafeCoerce参数已从toRawSql中移除;那个主要的疣就不再需要了。

目前已实施,需要Connection。我相信,正如类型同义词名称IdentInfo所示,esqueleto使用它来在查询中构建标识符。例如,它可以添加数据库名称。我还没有足够深入地探测源头。我只想说,通过假连接(即undefined)并不起作用;我不知道是否可以实现模拟连接。你的解决方案似乎可行。

你的解决方案的其余部分应该可以正常工作。由于toRawSql明确是一个内部函数,因此这里的API似乎是合理的。虽然其他人注意到它应该"可以生成一个连接中性字符串,它出现在toRawSql范围之外。

您提到您无法按照建议使用MonadLogger。你尝试了什么,发生了什么?