Sqlalchemy простой способ вставить или обновить?
У меня есть последовательность новых объектов. Все они похожи на это:
Foo (pk_col1 = x, pk_col2 = y, val = 'bar')
Некоторые из них являются Foo, которые существуют (т.е. только val отличается от строки в db)
и должен генерировать запросы на обновление. Другие должны создавать вставки.
Я могу придумать несколько способов сделать это, лучшее из них:
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()
Есть ли более простой способ?
Ответы
Ответ 1
Я думаю, что вы после new_obj = session.merge(obj). Это приведет к объединению объекта в отдельном состоянии в сеанс, если первичные ключи совпадают, и в противном случае он сделает новый. Таким образом, session.save(new_obj)
будет работать как для вставки, так и для обновления.
Ответ 2
Session.save_or_update(model)