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


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


2
接続を与える必要がある理由は、データベース上でポリモーフィックであり、推測されたSqlPersistインスタンスを使用してデータベース固有のSQL文字列を生成するためだと思います。
トーマス

2
ただし、接続と基盤となるデータベースのタイプは異なります。SQL文字列を純粋に生成できるはずです。
トム・エリス

回答:


2

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

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

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

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


MonadLogger残念ながら何を試したのか思い出せません。かなり前のことです。
トム・エリス

toRawSqlこの質問のユースケースで機能するかどうかを確認するためのテストプロジェクトがありますか?私はesqueletoそれを試すための環境をセットアップしましたが、persistent実際に実際のクエリを構築して消費するためのその他すべての機械を理解する時間がありませんでした。
クリスチャンコンクル2014

申し訳ありませんが、テスト環境やesqueletoプロジェクトはまったくありません。
トムエリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.