Esqueletoを取得してfrom
ステートメントからSQL文字列を生成するにはどうすればよいですか?
toRawSql
のドキュメントには、「永続的なクエリログをオンにするだけでよい」と書かれています。理解できるMonadLogger
の可能なすべての形式を試しましたが、SQLが出力されませんでした。同じドキュメントには、「この関数を手動で使用することは可能ですが、面倒です」とも記載されています。ただし、型のコンストラクターも、型の値を返す関数QueryType
もエクスポートされません。 QueryType
がnewtype
であることに気づき、unsafeCoerce
を使用することで、これを回避することができました。
また、SQLを生成するためにデータベースに接続する必要はないはずですが、Connection
(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
この質問が投稿されて以来、esqueleto
はいくつかの主要な改訂を経てきました。 バージョン2.1.2 およびそれ以前のいくつかのバージョンでは、unsafeCoerce
を必要とするQueryType a
パラメーターがtoRawSql
から削除されました。その大きな疣贅はもはや必要ありません。
現在実装されているように、Connection
が必要です。タイプシノニム名で示されているように、IdentInfo
、esqueleto
はこれを使用してクエリで識別子を作成すると思います。たとえば、データベース名を追加できます。私は実際にソースを十分な深さで配管していません。偽の接続(つまり、undefined
)を渡すことは機能しないと言えば十分です。モック接続を実装できるかどうかはわかりません。あなたの解決策は実行可能のようです。
ソリューションの残りの部分は正常に機能するはずです。 toRawSql
は明示的に内部関数であるため、ここでのAPIは妥当なようです。他の人は、接続に中立な文字列を生成することが「可能である」はずであると述べていますが、それはtoRawSql
の範囲外に表示されます。
推奨どおりにMonadLogger
を使用できなかったとのことです。何を試しましたか、そして何が起こりましたか?