【问题标题】:Ecto declare schema for a queryEcto 为查询声明模式
【发布时间】:2016-09-12 20:48:12
【问题描述】:

我正在尝试运行此查询:

select last_sd.*
from
  (select distinct(sensor_id) from sensor_data) s LEFT JOIN LATERAL
  (select * from sensor_data sd1 where sd1.sensor_id = s.sensor_id order by sd1.received_at desc limit 1) last_sd ON true

我得到的最接近的是:

from s in IotInABox.SensorData, distinct: true, select: s.sensor_id
|> join(:left_lateral, [s], sd in fragment("select * from sensor_data sd1 where sd1.sensor_id = ? order by sd1.received_at desc limit 1", s.sensor_id))
|> select([s, sd], sd)

然而这部分工作,因为它抛出

PostgreSQL requires a schema module when using selector "f1" but none was given. Please specify a schema or specify exactly which fields from "f1" you desire in query

意思是因为我没有from s in SensorData它不知道要使用哪个ecto模型,

有没有办法告诉 ecto 使用哪个模式作为查询结果?

【问题讨论】:

    标签: elixir ecto


    【解决方案1】:

    也许不完美,但这样的东西对我有用(在下面的示例中使用我项目中的名称):

    keys = Division.__schema__(:fields)
    query = from d in "divisions", select: map(d, ^keys)
    result = Repo.all(query) |> Enum.map(&(struct(Division, &1)))
    
    1. 首先您需要架构字段列表
    2. 选择地图形式的所有键
    3. 将地图映射回结构 ^^

    【讨论】:

    • 是的,我已经在另一个答案中阅读了该解决方案,但我只想声明架构,现在我可以再次加入架构,但这会影响性能
    • 我怀疑除了from s in SensorData 之外是否还有其他方法来声明架构
    • @alex88 也许您应该使用原始 sql 尝试 Ecto.Adapters.SQL.query,然后将 %Postgrex.Result{} 转换为您想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多