2009-09-05 19 views
26

Tengo una secuencia de objetos nuevos. Todos ellos parecen similar a esto:sqlalchemy forma fácil de insertar o actualizar?

Foo (pk_col1 = x, pk_col2 = y, val = 'bar')

Algunos de ellos son Foo que existe (es decir, sólo val difiere de la fila en el PP) y debe generar consultas de actualización. Los demás deben generar inserciones.

puedo pensar en algunas maneras de hacer esto, el mejor ser:

pk_cols = Foo.table.primary_key.keys() 
for f1 in foos: 
    f2 = Foo.get([getattr(f1, c) for c in pk_cols]) 
    if f2 is not None: 
     f2.val = f1.val # update 
     # XXX do we need to do session.add(f2) 
     # (or at least keep f2 alive until after the commit?) 
    else: 
     session.add(f1) # insert 

session.commit() 

¿Hay una manera más fácil?

+0

Esto parece un duplicado de http://stackoverflow.com/questions/708762/sqlalchemy-insert-or-replace-equivalent o http://stackoverflow.com/questions/1330475/how-do-i-efficiently -do-a-bulk-insert-o-update-with-sqlalchemy –

+1

@Duffy - No es la misma pregunta que realmente necesito distinguir en python las actualizaciones de las inserciones, no puedo hacerlo en la base de datos con un no -portable extensión SQL. – Eloff

Respuesta

36

Creo que estás buscando new_obj = session.merge(obj). Esto fusionará un objeto en un estado separado en la sesión si las claves principales coinciden y creará una nueva de lo contrario. Por lo tanto, session.save(new_obj) funcionará tanto para inserción como para actualización.

+8

'' session.save() '' ya no parece existir en las nuevas versiones de sqlalchemy. –

-3
Session.save_or_update(model) 
+9

save_or_update ha quedado en desuso desde 0.5 o menos. No funcionará, ya que todos los objetos nuevos se verán iguales en sqlalchemy (probablemente emitirá actualizaciones). No creo que emita consultas para ver cuáles realmente existen primero. – Eloff

+3

Probado y sqlalchemy hace todos INSERTS y luego barfs con un error de integridad en los objetos existentes. – Eloff

Cuestiones relacionadas