Ecto Raw sql с одним результатом в быстрый способ - PullRequest
0 голосов
/ 20 марта 2020

В качестве примера я сейчас использую следующее.

query = """
  SELECT reltuples
  AS approximate_row_count
  FROM pg_class
  WHERE relname = 'table';
"""

query
|> Repo.query!()
|> Map.get(:rows)
|> List.flatten()
|> List.first()
|> trunc()

Выполняет запрос, получает результат

%Postgrex.Result{
  columns: ["approximate_row_count"],
  command: :select,
  connection_id: 17152,
  messages: [],
  num_rows: 1,
  rows: [[1494644.0]]
}

выбирает строки [[1494644.0]]

сглаживает список [1494644.0]

получает первую запись 1494644.0

и преобразует ее в целое число 1494644

Я чувствую себя отдельно от последней шаг, должен быть более короткий путь для этого. Но я еще не нашел это. Обратите внимание, что я не ищу способ выполнить этот простой запрос в виде экто-запроса, а скорее в виде необработанного sql. Потому что я использую гораздо более сложные запросы с той же проблемой.

1 Ответ

2 голосов
/ 20 марта 2020

Я бы go с сопоставлением с образцом.

with [[result]] <- Repo.query!(query).rows,
  do: trunc(result)

Это вернет все строки из результата назад, если будет возвращено более одной строки. Чтобы полностью имитировать c исходное поведение (List.first/1, которое по существу совпадает с hd/1), используйте:

with [[result|_]|_] <- Repo.query!(query).rows,
  do: trunc(result)

Кроме того, можно корректно обрабатывать ошибки с помощью else: пункт.

...