我怎么能esqueleto为我生成一个SQLstring?

我怎样才能得到esqueleto从一个语句生成一个SQLstring?

toRawSql的文档说“你可能只是打开持久性的查询日志logging”。 我尝试了所有可能的MonadLoggerforms,但是从未打印过任何SQL。 同样的文件也说“手动使用这个function…是可能的,但繁琐的”。 但是,没有该types的构造函数,也没有任何返回typesQueryType被导出。 我设法通过注意到QueryType是一种新types并使用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

自从这个问题发布以来, esqueleto经历了一些重大的修改。 从版本2.1.2开始 ,以及几个较早的版本中,需要您的unsafeCoerceQueryType a参数已经从toRawSql移除; 那大疣不再是必需的了。

按照目前的实施, Connection是必需的。 我相信,如types同义词名称IdentInfoesqueleto使用它来在查询中构build标识符。 例如,它可能会添加数据库名称。 我没有真正深入地探讨这个来源。 可以这么说,通过假连接(即undefined )不起作用; 我不知道是否可以实施模拟连接。 你的解决scheme似乎可行。

剩下的解决scheme应该可以正常工作。 由于toRawSql是显式的内部函数,所以这里的API看起来是合理的。 虽然其他人注意到它“应该”有可能产生一个连接中立的string,它出现在toRawSql的范围toRawSql

你提到你不能像推荐的那样使用MonadLogger 。 你尝试了什么,发生了什么?