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

Tom*_*lis 86 haskell yesod esqueleto

如何从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)
Run Code Online (Sandbox Code Playgroud)

http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html

Chr*_*kle 2

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

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

您的解决方案的其余部分应该可以正常工作。由于toRawSql它是明确的内部函数,因此这里的 API 看起来很合理。尽管其他人指出“应该”可以生成连接中立的字符串,但它出现在toRawSql.

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