sqlalchemy easy way to insert or update?
Question:
I have a sequence of new objects. They all look like similar to this:
Foo(pk_col1=x, pk_col2=y, val=’bar’)
Some of those are Foo that exist (i.e. only val differs from the row in the db)
and should generate update queries. The others should generate inserts.
I can think of a few ways of doing this, the best being:
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()
Is there an easier way?
Answers:
I think you are after new_obj = session.merge(obj). This will merge an object in a detached state into the session if the primary keys match and will make a new one otherwise. So session.save(new_obj)
will work for both insert and update.
I have a sequence of new objects. They all look like similar to this:
Foo(pk_col1=x, pk_col2=y, val=’bar’)
Some of those are Foo that exist (i.e. only val differs from the row in the db)
and should generate update queries. The others should generate inserts.
I can think of a few ways of doing this, the best being:
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()
Is there an easier way?
I think you are after new_obj = session.merge(obj). This will merge an object in a detached state into the session if the primary keys match and will make a new one otherwise. So session.save(new_obj)
will work for both insert and update.