2012-08-28 17 views
20

が最も速いは、SQLAlchemyオブジェクトがデータベースに存在しない場合にのみ作成する方法を探しています。既に存在しない場合にのみ新しいオブジェクトを作成する最速の方法(SQLAlchemy)

私が今やっていることは、まずクエリが存在するかどうかを調べることです。そうでなければ作成します。 EG:

if not User.query.filter(email=user.email).count(): 
    db.session.add(user) 
    db.session.commit() 

これはこれを行う最良の方法ですか?いくつかのフィードバックが大好きです。ありがとう!

+1

このdezpezの記事を読んで、これらの更新または挿入されていない場合のジョブのどれがどれほど複雑であるかを知ることができます。http://www.depesz.com/2012/06/10 /どうしてですか?upsert-so-complicated/ –

+1

スピードについて:あなたがするすべてのことは、データベースにヒットするために往復する必要があります。私は、あなたがやっていることの間に大きな違いがあり、 'EXISTS'クエリを言うことは間違いありません。大きな時間コストは、クエリ自体ではなく、3つのラウンドトリップ(1つは 'SELECT'、1つは' INSERT'、もう1つは 'COMMIT')です。スピードが必要な場合は、大量のクエリをバッチ処理し、トランザクション内でより多くの作業を行い、可能であればサーバー側の機能を使用する必要があります。 –

+1

テーブルにレコードがすでに存在する頻度は? 50/50? 80/20?レコードの大部分が存在しない場合は、それを挿入して奇妙なUQ違反をキャッチするだけです。 –

答えて

16

another SO answerで概要を説明したget_or_create関数が私のニーズを満たしていることがわかりました。

関連する問題