elixir - get_by - palabras con ecto
¿Cómo puedo ver el SQL sin procesar generado para un Ecto.Query? (3)
Tengo un Ecto.Query
y un Repo
, de modo que puedo llamar a Repo.all(query)
y obtener resultados. Sin embargo, los resultados no son lo que espero.
¿Cómo puedo ver el SQL sin Ecto.Query
generará el Ecto.Query
desde el Ecto.Query
?
Es básicamente la respuesta de Gazler
, pero modificada para usar en el código:
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
Podría usar IO.inspect
simple, pero IO.inspect
una consulta con barras invertidas.
Puede usar 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", []}
La consulta puede ser cualquier estructura que implemente el protocolo Ecto.Queryable como Post
anterior (que es un módulo que importa Ecto.Schema
). Un Ecto.Query
también se puede pasar:
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]}
Un método de ayuda conveniente para imprimir SQL en bruto
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