2009-09-05 18 views
26

私は一連の新しいオブジェクトを持っています。それらはすべて、これに似たように見える:sqlalchemy簡単に挿入または更新できますか?

フー(pk_col1 = X、pk_col2 = Y、ヴァル=「バー」)

それらのいくつかは、存在する(すなわちのみ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() 

は簡単な方法はありますか?

+0

これはhttp://stackoverflow.com/questions/708762/sqlalchemy-insert-or-replace-equivalentやhttp://stackoverflow.com/questions/1330475/how-do-i-efficientlyの複製のようです-do-a-bulk-insert-or-update-with-sqlalchemy –

+1

@Duffy - Pythonで挿入からの更新を実際に区別する必要があるのと同じ質問ではなく、データベースではできません-portable SQL拡張機能です。 – Eloff

答えて

36

あなたはnew_obj = session.merge(obj)の後にいると思います。これにより、プライマリキーが一致する場合は分離された状態のオブジェクトがセッションにマージされ、それ以外の場合は新しいものが作成されます。したがって、session.save(new_obj)は挿入と更新の両方に機能します。

+8

'' session.save() ''は、sqlalchemyの新しいバージョンではもう存在しないようです。 –

-3
Session.save_or_update(model) 
+9

save_or_updateは0.5年ほど後に廃止されました。新しいオブジェクトはすべてsqlalchemyと同じように見えるので(おそらくそれは更新を発行する)、実際に最初に存在するものを見るためにクエリを発行するとは思わない。 – Eloff

+3

これをテストしたところ、sqlalchemyはすべてのINSERTを実行してから、既存のオブジェクトに対して整合性エラーのあるbarfsを実行します。 – Eloff

関連する問題