2016-09-12 2 views
0

Я пытаюсь запустить этот запрос:Ecto объявить схему для запроса

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, какую схему использовать в качестве результата запроса?

ответ

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

Я сомневаюсь, есть ли другой способ, чем «из s в SensorData» для объявления схемы – amatalai

+0

@ alex88, возможно, вам стоит попробовать Ecto.Adapters.SQL.query с вашим сырым sql, а затем конвертировать% Postgrex.Result {} в то, что вы хотите – amatalai

 Смежные вопросы

  • Нет связанных вопросов^_^