monoの開発ブログ

DataMapperが生成したクエリを確認する

実際に呼び出されるのがどんなクエリになっているか確認しないと不安なので、確認する方法を探してみました。

MySQLやPostrgeSQLであればRDBMS側のログを見れば分かりそうですが、SQLiteで、しかもDataMapperが内部で利用しているDataObjectsというライブラリの範囲内で、となるとスマートに実現する方法が見当たらなかったので、少し強引な方法を利用しています。

以下がクエリを取得するためのコードです。adapter内部で利用しているprivateメソッドであるselect_statementメソッドを強引に呼び出しています。引数にはQueryオブジェクトを渡しますが、これはモデルクラスのオブジェクトやコレクションに対してqueryメソッドを呼ぶことで取得できます。

DataMapper.repository(:default).adapter.__send__(:select_statement, Article.all.query)
DataMapper.repository(:default).adapter.__send__(:select_statement, Article.first(:id => 2011082523).query)

実行すると以下のようにクエリが得られます。

["SELECT \"id\", \"title\" FROM \"articles\" ORDER BY \"id\" DESC", []]
["SELECT \"id\", \"title\" FROM \"articles\" WHERE \"id\" = ? ORDER BY \"id\"", [2011082523]]

# わざわざSQLを確認するのは本末転倒な気がしないでもないですが。