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

时间:2016-04-21 13:23:11

标签: elixir ecto

我有一个Ecto.Query和一个Repo,以便我可以致电Repo.all(query)并获得结果。但是,结果并不是我所期望的。

如何从Repo看到Ecto.Query生成的原始SQL?

4 个答案:

答案 0 :(得分:41)

您可以使用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", []}

查询可以是实现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]}

答案 1 :(得分:8)

一种方便的打印原始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

答案 2 :(得分:0)

基本上是Gazler的答案,但已修改为在代码中使用:

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

您可以使用简单的IO.inspect,但是它将输出带有反斜杠的查询。

答案 3 :(得分:0)

to_sql/2已添加到您use Ecto.Repo所在的模块。按照惯例,该模块将命名为MyApp.Repo(MyApp将是您应用程序的名称)。在内部,它将使用Ecto.Adapters.SQL.to_sql/3,但是Ecto.Adapters.SQL更多是一个内部模块。

使用它的样子:

iex> query = Ecto.Query.where(Post, [p], p.views > 10)
iex> MyApp.Repo.to_sql(:all, query)
{"SELECT p.id, p.title, p.inserted_at, p.created_at FROM posts as p WHERE p.views > $1", [10]}