Python sqlalchemy插入或更新的简单方法?

Python sqlalchemy插入或更新的简单方法?,python,sqlalchemy,Python,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

我有一系列新对象。它们看起来都像这样:

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

有更简单的方法吗?

我想你在找。如果主键匹配,这将把处于分离状态的对象合并到会话中,否则将创建一个新的对象。因此,
session.save(new_obj)
将同时适用于插入和更新。

这看起来像是或@Duffy的副本-这与我在python中实际需要区分插入和更新的问题不同,我不能在具有不可移植SQL扩展的数据库中执行。
session.save()
在新版本的sqlalchemy中似乎不再存在了。我认为它不适用于mysql。我试过了,但没用。有人能证实这一点吗?我正在使用sqlalchemy 1.1.10