web-dev-qa-db-ja.com

Ecto.Query用に生成された生のSQLを表示するにはどうすればよいですか?

Repo.all(query)を呼び出して結果を取得できるように、Ecto.QueryRepoがあります。しかし、結果は私が期待するものではありません。

RepoEcto.Queryから生成する生のSQLを表示するにはどうすればよいですか?

29
Nathan Long

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", []}

クエリは、上記のPostEcto.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]}
46
Gazler

生の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
9
Dan Andreasson

基本的にはGazlersの回答ですが、コードで使用するように変更されています。

query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")

簡単なIO.inspectを使用できますが、バックスラッシュを含むクエリを出力します。

0
denis.peplin