В общем, вы должны быть очень осторожны с обновлением так, как вы хотите,
потому что эти объекты PhysicalLinksDir
не всегда будут синхронизированы с
базовые Device
и PhysicalLink
, которые вы можете иметь в сеансе / базе данных.
Я, очевидно, не знаю ваших требований, но я предпочитаю не иметь таких несоответствий при работе с моей моделью.
Кроме того, существует проблема с типом отображения, который у вас есть. Вы ожидаете, что у вас будет 2 строки PhysicalLinksDir
для каждой строки PhysicalLink
(по одной на каждую сторону), но если вы попробуете это, вы увидите, что это не так. Причина этого в том, что первый столбец (physical_links_id
) считается primary_key
, поэтому
Объект запроса отбрасывает второй объект с тем же значением.
Чтобы это исправить, вам нужно настроить primary_key
вручную. Предполагая, что может быть только один
соединение между двумя различными устройствами, решение ниже поможет. Возможно, вам придется расширить его, чтобы включить port
:
physical_links_dir_mapper = orm.mapper(PhysicalLinksDir, physical_links_ua,
# @note: add this
primary_key=[physical_links_ua.c.physical_links_id, physical_links_ua.c.this_device_id],
)
УДАЛИТЬ : Теперь, чтобы поддержать delete
, все, что вам нужно сделать, это добавить связь между вашим PLD
и фактическим PhysicalLink
, а session.delete(my_PLD); session.commit()
также удалит PhysicalLink
это представляет:
physical_links_dir_mapper.add_property(
'physical_link', orm.relation(PhysicalLink, primaryjoin=(
PhysicalLinksDir.physical_links_id == PhysicalLink.physical_links_id),
foreign_keys=[PhysicalLinksDir.physical_links_id]
))
Но на самом деле удаление может работать из коробки, поскольку модель мягко связана с таблицей physical_link
.
INSERT : Ну, это легко сделать с помощью объекта PhysicalLink
напрямую, так что я бы просто сохранил его таким образом.
ОБНОВЛЕНИЕ : Вы, вероятно, могли бы достичь этого с помощью Сеансовых событий , но самый простой способ - это просто обернуть все атрибуты в @property
, который делегировал бы изменение на соответствующий объект.
ВАЖНО : я все еще думаю, что этот способ работы не очень хорош, потому что ссылки не обновляются автоматически и ваша память UnitOfWork
может быть несовместимой.
Если также было бы полезно понять, почему вы думаете, этот способ работы с вашими объектами будет лучше? Каковы случаи использования этого приложения?