我有一个Ecto.Query
和一个Repo
,以便我可以致电Repo.all(query)
并获得结果。但是,结果并不是我所期望的。
如何从Repo
看到Ecto.Query
生成的原始SQL?
答案 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]}