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