How can I see the raw SQL generated for an Ecto.Query?

前端 未结 4 1075
庸人自扰
庸人自扰 2021-02-01 15:02

I have an Ecto.Query and a Repo, such that I can call Repo.all(query) and get results. However, the results are not what I expect.

相关标签:
4条回答
  • 2021-02-01 15:35

    to_sql/2 is added to the module you use Ecto.Repo on. By convention, that module would be named MyApp.Repo (MyApp would be your app's name). Internally, it would use Ecto.Adapters.SQL.to_sql/3, but Ecto.Adapters.SQL is more of an internal module.

    Using it would look like:

    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]}
    
    0 讨论(0)
  • 2021-02-01 15:46

    A convenient helper method for printing 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
    
    0 讨论(0)
  • 2021-02-01 15:50

    It's basically Gazlers answer, but modified to use in code:

    query = from p in Post
    {query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
    IO.puts("#{query}, #{inspect(params)}")
    

    You could use simple IO.inspect, but it'll output a query with backslashes.

    0 讨论(0)
  • 2021-02-01 15:55

    You can use 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", []}
    

    This function is also available under the repository with name to_sql if you’re using a SQL based adapter:

     iex> Repo.to_sql(:all, Post)
      {"SELECT p.id, p.title, p.inserted_at, p.created_at FROM posts as p", []}
    

    The query can be any struct that implements the Ecto.Queryable protocol like Post above(which is a module that imports Ecto.Schema). An Ecto.Query can also be passed:

    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]}
    
    0 讨论(0)
提交回复
热议问题