如何查看为Ecto.Query生成的原始SQL?

Nat*_*ong 30 elixir ecto

我有一个Ecto.Query和一个Repo,这样我就可以打电话Repo.all(query)并获得结果.但是,结果并不是我所期望的.

如何查看Repo将从中生成的原始SQL Ecto.Query

Gaz*_*ler 48

您可以使用Ecto.Adapters.SQL.to_sql/3:

iex> Ecto.Adapters.SQL.to_sql(:all, Repo, Post)
{"SELECT p.id, p.title, p.inserted_at, p.created_at FROM posts as p", []}
Run Code Online (Sandbox Code Playgroud)

查询可以是任何实现上述Ecto.Queryable协议的结构Post(这是一个导入的模块Ecto.Schema).一个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]}
Run Code Online (Sandbox Code Playgroud)


Dan*_*son 9

一种方便的帮助方法,用于打印原始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
Run Code Online (Sandbox Code Playgroud)