Wann sollte ich mich verpflichten, mit SQLAlchemy mit einer for-Schleife?
Ist das so richtig? Ich weiß, die ersten funktionieren wird, aber ich vermute, es ist mehr Arbeit für die DB als möglicherweise notwendig. Wird der zweite genauso gut funktionieren, aber mit weniger Arbeit für die DB? Ich bin mit MySQL FWIW.
for item in items:
db.session.add(item)
db.session.commit()
oder
for item in items:
db.session.add(item)
db.session.commit()
- Wie viele Operationen Sie ausführen insgesamt? Sie sind ressourcenintensiv? Es sei denn, es gibt irgendeinen Grund, Sie nicht wollen, zu Begehen, nachdem jeder, ich sehe nicht, warum Sie würde nicht wollen, verwenden Sie immer die #1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, deine zweite Lösung ist besser, aber es hängt davon ab, wie Sie konfiguriert haben, Ihre Sitzung. Speziell die autoflush-und autocommit-Einstellungen. Auch Sie sollten mit einem Motor, der hat gute Unterstützung für Transaktionen, wie etwa innodb.
Vorausgesetzt, Sie haben den autocommit-und autoflush beide aus, dann würden Sie Spülen Ihr einfügen, um den server zu Begehen, die vor der Transaktion und erstellen anschließend eine andere Transaktion bei jeder iteration die eine Menge unnötiger Arbeit sowohl in SQLAlchemy und MySQL.
Ich würde empfehlen, mit add_all, wenn Sie eine einfache Liste von Elementen hinzufügen, wie in deinem Beispiel, wenn Sie müssen die Schleife wird dann auf jeden Fall gelten die commit außerhalb der Schleife.
http://docs.sqlalchemy.org/en/latest/orm/session.html#sqlalchemy.orm.session.Session.add_all
Einen zusätzlichen Hinweis, wenn etwas schief zu gehen einen Teil des Weges durch die Schleife Ihrer Transaktion rollback schreibt nur zu Ihrem vor commit in die Schleife, die ist wahrscheinlich nicht das, was Sie wollen, wenn Sie Transaktionen verwenden. Zum Beispiel, nur die Hälfte Ihrer Elemente in der Liste kann die Datenbank geschrieben werden, wenn ein Fehler tritt auf halbem Weg durch die Schleife. In der Erwägung, dass Aufruf von commit außerhalb der Schleife garantiert, dass Ihre Schleife beendet und wird ALLE commit oder ALLE zurückgesetzt.
Hinzufügen auf die Lösung: Dies ist, wie Sie verwenden können, add_all()
Statt der zwei Zeilen hinzufügen verwenden
Können Sie diese:
session.bulk_save_objects([User, User, Permission])