У меня есть Ecto.Query
и Repo
, так что я могу вызвать Repo.all(query)
и получить результаты. Однако результаты не такие, как я ожидаю.
Как я могу увидеть необработанный SQL, который Repo
сгенерирует из Ecto.Query
?
У меня есть Ecto.Query
и Repo
, так что я могу вызвать Repo.all(query)
и получить результаты. Однако результаты не такие, как я ожидаю.
Как я могу увидеть необработанный SQL, который Repo
сгенерирует из Ecto.Query
?
Вы можете использовать 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", []}
Эта функция также доступна в репозитории с именем to_sql
, если вы используете адаптер на основе 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 > $1", [10]}
query
вместо Post
.
- person Nathan Long; 21.04.2016
Ecto.Schema
. Я обновлю свой ответ.
- person Gazler; 21.04.2016
Удобный вспомогательный метод для печати необработанного 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
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 > $1", [10]}
Repo.to_sql/3 is undefined or private
- person AlxVallejo; 03.12.2019
Repo.to_sql/3
, а MyApp.Repo.to_sql/2
. Это должно работать с Ecto 3 или, может быть, даже раньше.
- person Gjaldon; 04.12.2019
Это в основном ответ Gazler
, но измененный для использования в коде:
query = from p in Post
{query, params} = Ecto.Adapters.SQL.to_sql(:all, Repo, query)
IO.puts("#{query}, #{inspect(params)}")
Вы можете использовать простой IO.inspect
, но он выведет запрос с обратной косой чертой.