SQLAlchemy 简便的插入或更新方法?

43 投票
1 回答
60046 浏览
提问于 2025-04-15 14:05

我有一系列新的对象,它们看起来都差不多,像这样:

Foo(pk_col1=x, pk_col2=y, val='bar')

其中有一些是已经存在的Foo(也就是说,只有val和数据库中的行不同),这些应该生成更新的查询。其他的则应该生成插入的查询。

我能想到几种方法来实现这个,最好的方法是:

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 个回答

59

我觉得你想要的是 new_obj = session.merge(obj)。这个操作会把一个处于“脱离状态”的对象合并到会话中,只要它的主键匹配。如果主键不匹配,就会创建一个新的对象。所以 session.save(new_obj) 这个操作可以同时用于插入和更新数据。

撰写回答