如何使用Ecto提取表内全部主键且不获取其他冗余字段
Ecto仅提取单个指定字段的实现方案
Ecto提供原生的查询语法支持仅拉取指定字段,不会查询表内其他多余数据,比拉取全量数据后再用Map.take过滤的性能高很多,两种常用实现方式如下:
- 方案1:直接获取字段值的一维列表
如果只需要主键(或其他指定字段)的纯值列表,直接在查询中指定select对应字段即可,示例如下(以Schema为User、主键为id为例):
# 最终生成的SQL仅查询id字段,返回 [1,2,3...] 格式的列表 user_ids = from u in User, select: u.id |> Repo.all()
如果需要动态传入字段名,可以用field/2函数实现:
target_field = :id result = from u in User, select: field(u, ^target_field) |> Repo.all()
- 方案2:获取仅包含指定字段的结构体/Map
如果需要保留结构体/Map的格式,仅过滤掉不需要的字段,可以用map/2函数实现:
# 返回 [%{id: 1}, %{id: 2}...] 格式的列表,仅保留指定字段 user_id_list = from u in User, select: map(u, [:id]) |> Repo.all()
内容的提问来源于stack exchange,提问作者Drathier
相关产品推荐
相关产品推荐

