SQLAlchemy: мелкая копия, избегающая отложенной загрузки - PullRequest
5 голосов
/ 26 октября 2009

Я пытаюсь автоматически создать поверхностную копию сопоставленной SA объект .. На данный момент моя функция просто:

newobj = src.__class__()
for prop in class_mapper(src.__class__).iterate_properties:
    setattr(newobj, prop.key, getattr(src, prop.key))

но у меня проблемы с ленивыми отношениями ... Очевидно, getattr вызывает ленивую загрузку, но так как мне не нужны их значения правильно прочь, я хотел бы просто скопировать "это должно быть лениво загружено" - состояние атрибут ... это возможно?

Редактировать: Мне это нужно для системы «регистрации данных». То есть, когда кто-то обновляет постоянную сущность, я должен создать новую запись, а затем пометить старую как таковую.
Чтобы сделать это, я создаю поверхностную копию объекта (поэтому SQLA выдает INSERT вместо UPDATE) и работаю оттуда .. Система работает довольно хорошо (она используется уже несколько месяцев), но теперь я хотел бы улучшить ее, чтобы не требовалось, чтобы все отношения сначала загружались лениво ..

1 Ответ

6 голосов
/ 26 октября 2009

Вам нужно только скопировать свойства столбца, которые можно легко отфильтровать с помощью isinstance(prop, sqlalchemy.orm.ColumnProperty). Обратите внимание, что вы ДОЛЖНЫ копировать хранимые извне отношения (все многие ко многим), поскольку в основной таблице нет соответствующих им столбцов. Это не может быть сделано с высокоуровневым интерфейсом без отложенной загрузки, поэтому я предпочел бы принять этот компромисс. Соотношение «многие ко многим» можно определить с помощью теста isinstance(prop, RelationProperty) and prop.secondary. Полученный код будет выглядеть следующим образом:

from sqlalchemy.orm import object_mapper, ColumnProperty, RelationProperty

newobj = type(src)()
for prop in object_mapper(src).iterate_properties:
    if (isinstance(prop, ColumnProperty) or
        isinstance(prop, RelationProperty) and prop.secondary):
    setattr(newobj, prop.key, getattr(src, prop.key))

Также обратите внимание, что SQLAlchemy предназначен для поддержки одного объекта, загруженного для каждого удостоверения, в то время как ваша копия ломает это, когда копируются свойства удостоверения (первичного ключа), но это, вероятно, не тот случай, если вы сохраняете с новым (версионным) ) идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...