J'ai un Ecto.Query
et une Repo
, de sorte que je peux appeler Repo.all(query)
et obtenir des résultats. Cependant, les résultats ne sont pas ce que j'attends.
Comment puis-je voir le SQL brut que la Repo
va générer à partir du Ecto.Query
?
Vous pouvez utiliser 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 requête peut être n’importe quelle structure qui implémente le Ecto.Queryable protocole comme Post
ci-dessus (qui est un module qui importe Ecto.Schema
). Un Ecto.Query
peut également être passé:
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]}
Une méthode d'assistance pratique pour imprimer du SQL brut
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
C'est fondamentalement la réponse Gazler
s, mais modifiée pour être utilisée dans le code:
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
Vous pouvez utiliser un simple IO.inspect
, mais une requête avec des barres obliques inverses sera générée.