24

どちらが正しい?最初のものが機能することはわかっていますが、DBにとってはおそらく必要以上の作業だと思います。2つ目も同様に機能しますが、DBの作業は少なくなりますか?MySQLFWIWを使用しています。

for item in items:
    db.session.add(item)
    db.session.commit()

また

for item in items:
    db.session.add(item)
db.session.commit()
4

3 に答える 3

20

2番目のソリューションの方が優れていると思いますが、セッションの構成方法によって異なります。具体的には、autoflush と autocommit の設定です。また、innodb など、トランザクションを適切にサポートするエンジンを使用する必要があります。

自動コミットと自動フラッシュの両方がオフになっていると仮定すると、挿入をサーバーにフラッシュし、前のトランザクションをコミットしてから、SQLAlchemy と MySQL の両方で多くの不要な作業を作成している反復ごとに別のトランザクションを作成します。

例のように追加するアイテムの単純なリストがある場合は、 add_all を使用することをお勧めします。それ以外の場合は、ループが必要な場合は、ループの外側でコミットを確実に適用してください。

http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.add_all

db.session.add_all(items)
db.session.commit()

ループの途中で何か問題が発生した場合、トランザクションはループ内の以前のコミットにのみ書き込みをロールバックします。これは、トランザクションを使用している場合に望ましくない可能性があります。たとえば、ループの途中でエラーが発生した場合、リスト内のアイテムの半分だけがデータベースに書き込まれる可能性があります。commit をループの外側で呼び出すと、ループが終了し、すべてコミットされるか、またはすべてロールバックされることが保証されます。

于 2013-02-02T23:08:37.170 に答える
-1

これを使用できます:

session.bulk_save_objects([User, User, Permission])

于 2019-11-05T09:39:50.783 に答える