Вы можете запускать необработанные SQL запросы, используя базовый адаптер , например
query = """
select username, email, nickname, lastname, firstname, phone
from a
where NOT EXISTS
(
select b.tip_team_id from b
where b.season_id = $1::integer
and b.round_id = $2::integer
and a.id = b.user_id
)
"""
Ecto.Adapters.SQL.query!(MyApp.Repo, query, [1, 2])
Обратите внимание, что функция Ecto.Adapters.SQL.query!/3
будет принимать список упорядоченных аргументов для замены в ваш запрос (чтобы первый элемент в списке заменял $1
в запросе, второй - $2
, et c). Чтобы это сработало, вам необходимо передать определенный модуль Ecto.Repo , в котором вы указали use Ecto.Repo
и механизм базы данных (MyApp.Repo
в приведенном выше примере). Также обратите внимание, что вы можете опустить суффикс ::integer
, если подставляемое значение не является целым числом.
Возвращенным результатом будет структура %Postgrex.Result{}
, например,
%Postgrex.Result{
columns: ["username", "email", "nickname", "lastname", "firstname", "phone"],
command: :select,
connection_id: 327,
messages: [],
num_rows: 1,
rows: [["admin", "admin@email", "Big Guy", "Jones", "Boss", "888-555-1212"]]
}
Итак вам нужно будет выполнить некоторое сопоставление с образцом, чтобы получить список rows
из этой структуры.
Иногда проще просто использовать необработанные запросы, подобные этому, чем тратить время на определение модулей Ecto Schema - это действительно зависит от вас и ваших вариантов использования, но в зависимости от ситуации и ваших предпочтений вы можете sh сделать это более «стандартным» способом определения схем Ecto для каждой таблицы в вашей базе данных.