2016-09-12 6 views
0

에 대한 스키마를 선언체외 내가이 쿼리를 실행하기 위해 노력하고있어 쿼리

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에게 알리는 방법이 있습니까?

답변

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. 내가 다른 답변에서 해당 솔루션을 읽었 네 구조체 ^^
+0

다시지도를지도하지만 난 그냥 선언하고 싶습니다 이제는 스키마에 다시 참여할 수는 있지만 성능에 영향을 미친다. – alex88

+0

스키마를 선언하기 위해'SensorData에있는 from '보다 다른 방법이 있는지 의심 스럽다 – amatalai

+0

@ alex88 어쩌면 Ecto.Adapters.SQL.query를 시도해야한다. 원시 SQL을 사용하고 % Postgrex.Result {}를 원하는 것으로 변환하십시오. – amatalai

관련 문제