Подтвердить что ты не робот

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()

Есть ли более простой способ?

4b9b3361

Ответ 1

Я думаю, что вы после new_obj = session.merge(obj). Это приведет к объединению объекта в отдельном состоянии в сеанс, если первичные ключи совпадают, и в противном случае он сделает новый. Таким образом, session.save(new_obj) будет работать как для вставки, так и для обновления.

Ответ 2

Session.save_or_update(model)