J'ai une séquence de nouveaux objets. Ils ressemblent tous à ceci:
Foo (pk_col1 = x, pk_col2 = y, val = 'bar')
Certains d'entre eux sont Foo qui existent (c'est-à-dire que seul val diffère de la ligne dans la base de données) et devraient générer des requêtes de mise à jour. Les autres devraient générer des insertions.
Je peux penser à quelques façons de le faire, le meilleur étant:
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()
Existe-t-il un moyen plus simple?
Je pense que vous recherchez new_obj = session.merge (obj) . Cela fusionnera un objet dans un état détaché dans la session si les clés primaires correspondent et en fera un autre dans le cas contraire. Donc session.save(new_obj)
fonctionnera à la fois pour l'insertion et la mise à jour.