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/1
与 hd/1
基本相同),请使用:
with [[result|_]|_] <- Repo.query!(query).rows,
do: trunc(result)
此外,可以使用 else:
子句优雅地处理错误。
作为示例,我现在正在使用以下内容。
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/1
与 hd/1
基本相同),请使用:
with [[result|_]|_] <- Repo.query!(query).rows,
do: trunc(result)
此外,可以使用 else:
子句优雅地处理错误。