86

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

的文档toRawSql说“您可以只打开持久性的查询日志记录”。MonadLogger我尝试了所有我能理解的可能形式,但它从未打印任何 SQL。相同的文档还说“手动使用此功能......是可能的,但很乏味”。但是,不会导出该类型的构造函数,也不会QueryType导出任何返回该类型值的函数。我注意到这QueryType是 anewtype并使用unsafeCoerce!

Connection即使不需要连接到数据库来生成 SQL,我也被迫提供一个(我通过 SQLite 获得的)。

这就是我所拥有的。一定会有更好的办法。

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

4

1 回答 1

2

自此问题发布以来,esqueleto已经经历了许多重大修订。从2.1.2 版本和几个更早的版本开始, QueryType a您需要的参数unsafeCoerce已从toRawSql;中删除。不再需要那个大疣。

按照目前的实施,aConnection是必需的。我相信,正如类型同义词名称所示IdentInfoesqueleto使用它在查询中构建标识符。例如,它可以添加数据库名称。我还没有真正深入了解源。可以这么说,传递虚假连接(即undefined)是行不通的;我不知道是否可以实现模拟连接。您的解决方案似乎可行。

您的解决方案的其余部分应该可以正常工作。由于toRawSql是明确的内部函数,这里的 API 似乎是合理的。尽管其他人指出“应该”可以生成一个与连接无关的字符串,但它出现在toRawSql.

你提到你不能MonadLogger按照推荐的方式使用。你尝试了什么,发生了什么?

于 2014-11-10T21:52:57.247 回答