Ecto raw sql 快速获得单一结果

Ecto raw sql with single result in a quick way

作为示例,我现在正在使用以下内容。

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

我觉得除了最后一步,必须有更短的方法。但我还没有找到它。请注意,我不是在寻找一种方法来执行该简单查询作为 ecto 查询,而是作为原始 sql。因为我对同一个问题使用了很多更复杂的查询。

我会选择模式匹配。

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

如果有多于一行 returned,这将 return 结果中的所有行返回。要完全模仿原始行为(List.first/1hd/1 基本相同),请使用:

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

此外,可以使用 else: 子句优雅地处理错误。