web-dev-qa-db-ja.com

esqueletoでSQL文字列を生成するにはどうすればよいですか?

Esqueletoを取得してfromステートメントからSQL文字列を生成するにはどうすればよいですか?

toRawSqlのドキュメントには、「永続的なクエリログをオンにするだけでよい」と書かれています。理解できるMonadLoggerの可能なすべての形式を試しましたが、SQLが出力されませんでした。同じドキュメントには、「この関数を手動で使用することは可能ですが、面倒です」とも記載されています。ただし、型のコンストラクターも、型の値を返す関数QueryTypeもエクスポートされません。 QueryTypenewtypeであることに気づき、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

86
Tom Ellis

この質問が投稿されて以来、esqueletoはいくつかの主要な改訂を経てきました。 バージョン2.1.2 およびそれ以前のいくつかのバージョンでは、unsafeCoerceを必要とするQueryType aパラメーターがtoRawSqlから削除されました。その大きな疣贅はもはや必要ありません。

現在実装されているように、Connectionが必要です。タイプシノニム名で示されているように、IdentInfoesqueletoはこれを使用してクエリで識別子を作成すると思います。たとえば、データベース名を追加できます。私は実際にソースを十分な深さで配管していません。偽の接続(つまり、undefined)を渡すことは機能しないと言えば十分です。モック接続を実装できるかどうかはわかりません。あなたの解決策は実行可能のようです。

ソリューションの残りの部分は正常に機能するはずです。 toRawSqlは明示的に内部関数であるため、ここでのAPIは妥当なようです。他の人は、接続に中立な文字列を生成することが「可能である」はずであると述べていますが、それはtoRawSqlの範囲外に表示されます。

推奨どおりにMonadLoggerを使用できなかったとのことです。何を試しましたか、そして何が起こりましたか?

2