Преобразование запроса sql в запрос Ecto - PullRequest
0 голосов
/ 16 июня 2020

У меня есть запрос sql следующего вида

select username, email, nickname, lastname, firstname, phone 
 from a
 where NOT EXISTS
 (
 select b.tip_team_id from b
 where b.season_id = 1
 and b.round_id = 2
 and a.id = b.user_id
 );

Я хочу преобразовать его в запрос Ecto ... Может ли кто-нибудь мне с этим помочь?

1 Ответ

0 голосов
/ 17 июня 2020

Вы можете запускать необработанные 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 для каждой таблицы в вашей базе данных.

...