tutorial query how example espaƱol deepcopy python sqlalchemy duplicates clone instance

python - query - sqlalchemy select



SQLAlchemy: ModificaciĆ³n de objeto separado (2)

este caso está disponible usando la función auxiliar make_transient() :

inst = session.query(Model).first() session.expunge(inst) make_transient(inst) inst.id = None session.add(inst) session.flush() print inst.id #New ID

Quiero duplicar una instancia de modelo (fila) en SQLAlchemy usando el orm. Mi primer pensamiento fue hacer esto:

i = session.query(Model) session.expunge(i) old_id = i.id i.id = None session.add(i) session.flush() print i.id #New ID

Sin embargo, al parecer, el objeto separado aún "recuerda" la identificación que tenía, a pesar de que la configuré en Ninguna mientras estaba desconectada. Por lo tanto, session.flush () intenta ejecutar una ACTUALIZACIÓN cambiando la clave primaria a nula.

¿Es este el comportamiento esperado? ¿Cómo puedo eliminar la ''memoria'' de este atributo y simplemente tratar el objeto separado como un nuevo objeto al agregarlo nuevamente a la sesión? ¿Cómo, en general, se clona una instancia del modelo SQLAlchemy?


def duplicate(self): arguments = dict() for name, column in self.__mapper__.columns.items(): if not (column.primary_key or column.unique): arguments[name] = getattr(self, name) return self.__class__(**arguments)