如何查看为 Ecto.Query 生成的原始 SQL?
How can I see the raw SQL generated for an Ecto.Query?
我有一个 Ecto.Query
和一个 Repo
,这样我就可以调用 Repo.all(query)
并获得结果。然而,结果并不是我所期望的。
如何查看 Repo
将从 Ecto.Query
生成的原始 SQL?
您可以使用 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", []}
如果您使用的是基于 SQL 的适配器,此功能也可以在名称为 to_sql
的存储库下使用:
iex> Repo.to_sql(:all, 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 > ", [10]}
方便的raw打印辅助方法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
的答案,但修改为在代码中使用:
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
您可以使用简单的 IO.inspect
,但它会输出带有反斜杠的查询。
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 > ", [10]}
我有一个 Ecto.Query
和一个 Repo
,这样我就可以调用 Repo.all(query)
并获得结果。然而,结果并不是我所期望的。
如何查看 Repo
将从 Ecto.Query
生成的原始 SQL?
您可以使用 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", []}
如果您使用的是基于 SQL 的适配器,此功能也可以在名称为 to_sql
的存储库下使用:
iex> Repo.to_sql(:all, 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 > ", [10]}
方便的raw打印辅助方法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
的答案,但修改为在代码中使用:
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
您可以使用简单的 IO.inspect
,但它会输出带有反斜杠的查询。
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 > ", [10]}