web-dev-qa-db-fra.com

Comment voir le SQL brut généré pour un Ecto.Query?

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?

22
Nathan Long

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]}
39
Gazler

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
7
Dan Andreasson

C'est fondamentalement la réponse Gazlers, 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.

0
denis.peplin