SQLAlchemy: Мелкая копия, избегающая ленивой загрузки

файлы дб SQLite являются просто файлами, таким образом, первый шаг должен был бы удостовериться, что это не только для чтения. Другая вещь сделать состоит в том, чтобы удостовериться, что у Вас нет своего рода GUI средством просмотра DB SQLite с DB открытый. У Вас мог быть DB, открытый в другой оболочке, или Ваш код может иметь открытый DB. Обычно Вы видели бы это, если различный поток или приложение, такое как Браузер Базы данных SQLite имеет DB, открытый для записи.

5
задан Joril 26 October 2009 в 09:10
поделиться

1 ответ

Вам нужно скопировать столбец только свойства, которые можно легко отфильтровать с помощью isinstance (prop, sqlalchemy.orm.ColumnProperty) . Обратите внимание, что вам НЕОБХОДИМО копировать внешние отношения (все-многие-ко-многим), так как в основной таблице нет соответствующих им столбцов. Это невозможно сделать с высокоуровневым интерфейсом без отложенной загрузки, поэтому я бы предпочел принять этот компромисс. Отношения «многие ко многим» можно определить с помощью теста isinstance (prop, RelationProperty) и 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 предназначена для поддержки одного объекта, загруженного для каждого идентификатора,

6
ответ дан 14 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: