Как написать функцию ponyORM для этого конкретного c sql запроса? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть data_template, devices_data и device. Каждое устройство имеет значение для каждой информации в data_template. Эти значения хранятся в devices_data. Я хочу перечислить data_template для одного устройства со значениями, которые имеет это устройство. Если для некоторых данных нет значения, покажите None.

Это как-то связано с left_join. Вот моя модель:

from pony.orm import *

db = Database()

class DataTemplate(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    data_values = Set("DeviceData")

class Device(db.Entity):
    id = PrimaryKey(int, auto=True)
    name = Required(str)
    device_values = Set("DeviceData")

class DeviceData(db.Entity):
    id = PrimaryKey(int, auto=True)
    value = Required(int)
    data_name = Required(DataTemplate)
    device= Required(Device)

db.bind(provider='sqlite', filename=':memory:')

db.generate_mapping(create_tables=True)

set_sql_debug(True)

with db_session:

    dev1 = Device(name='Receiver')
    dev2 = Device(name='TV')
    dat_temp1 = DataTemplate(name="height")
    dat_temp2 = DataTemplate(name="width")
    dat_temp3 = DataTemplate(name="length")

    dd1 = DeviceData(value=100, data_name=dat_temp1, device=dev1)
    dd2 = DeviceData(value=50, data_name=dat_temp2, device=dev1)
    dd3 = DeviceData(value=200, data_name=dat_temp1, device=dev2)
    dd4 = DeviceData(value=40, data_name=dat_temp2, device=dev2)
    dd5 = DeviceData(value=30, data_name=dat_temp3, device=dev2)

    commit()
    print(left_join((d, val) for d in DataTemplate for val in d.data_values if val.device == dev1)[:])

с этим left_join Я получаю: [(DataTemplate[1], DeviceData[1]), (DataTemplate[2], DeviceData[2])] и равен:

SELECT "d"."id", "val"."id"
FROM "DataTemplate" "d"
  LEFT JOIN "DeviceData" "val"
    ON "d"."id" = "val"."data_name"
WHERE "val"."device" = ?
[1]

но я хочу получить: [(DataTemplate[1], DeviceData[1]), (DataTemplate[2], DeviceData[2]), (DataTemplate[3], None) и этот запрос должен быть:

SELECT "d"."id", "val"."id"
FROM "DataTemplate" "d"
  LEFT JOIN "DeviceData" "val"
    ON "d"."id" = "val"."data_name" AND "val"."device" = ?
[1]
...