如何获得esqueleto为我生成SQL字符串?


86

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

的文档toRawSql说:“您可以只打开持久性查询日志”。我尝试了所有可能MonadLogger理解的形式,但从未打印任何SQL。同一文档还说“手动使用此功能...是可能的,但很乏味”。但是,不会QueryType导出该类型的构造函数,也不会导出任何返回该类型的值的函数。我设法注意到QueryTypeanewtype并使用来解决这个问题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


2
我相信需要建立连接的原因是因为它在数据库上是多态的,并且使用推断的SqlPersist实例来生成特定于数据库的SQL字符串。
托马斯

2
但是,基础数据库的连接和类型是不同的。应该可以纯粹生成SQL字符串。
汤姆·埃利斯

Answers:


2

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

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

解决方案的其余部分应该可以正常工作。由于toRawSql明确是内部函数,因此此处的API似乎很合理。尽管其他人指出,“应该”可以生成与连接无关的字符串,但该字符串超出的范围toRawSql

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


我不记得我尝试了什么MonadLogger。相当早以前。
汤姆·埃利斯

您是否碰巧有一个测试项目,以查看现在是否toRawSql可以解决该问题的用例?我设置了一个esqueleto环境来进行测试,但是我没有时间去弄清persistent所有其他机制来实际构造和使用一个真正的查询。
Christian Conkle 2014年

我完全没有任何测试环境或任何esqueleto项目,对不起。
汤姆·埃利斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.