web-dev-qa-db-fra.com

sqlalchemy moyen facile d'insérer ou de mettre à jour?

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?

39
Eloff

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.

52
David Raznick