86

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

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

4

1 に答える 1

2

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

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

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

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

于 2014-11-10T21:52:57.247 に答える