Repo.all(query)
を呼び出して結果を取得できるように、Ecto.Query
とRepo
があります。しかし、結果は私が期待するものではありません。
Repo
がEcto.Query
から生成する生のSQLを表示するにはどうすればよいですか?
Ecto.Adapters.SQL.to_sql/ を使用できます。
iex> Ecto.Adapters.SQL.to_sql(:all, Repo, Post)
{"SELECT p.id, p.title, p.inserted_at, p.created_at FROM posts as p", []}
クエリは、上記のPost
(Ecto.Schema
をインポートするモジュール)のような Ecto.Queryable プロトコルを実装する任意の構造体にすることができます。 Ecto.Query
も渡すことができます:
iex> query = Ecto.Query.where(Post, [p], p.views > 10)
iex> Ecto.Adapters.SQL.to_sql(:all, Repo, query)
{"SELECT p.id, p.title, p.inserted_at, p.created_at FROM posts as p WHERE p.views > $1", [10]}
生のSQLを印刷するための便利なヘルパーメソッド
def print_sql(queryable) do
IO.inspect(Ecto.Adapters.SQL.to_sql(:all, Repo, queryable))
queryable
end
def list_new_foos() do
Foo
|> where([foo], foo.bar == 1337)
|> limit(100)
|> print_sql
|> Repo.all()
end
基本的にはGazler
sの回答ですが、コードで使用するように変更されています。
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
簡単なIO.inspect
を使用できますが、バックスラッシュを含むクエリを出力します。