SQLAlchemy-Raw-SQL-vs-Expression-Sprachanweisungen

Wenn Sie über eine SQLA-Expression-Language-Anweisung mehrere Zeilen in eine MySQL-DB einfügen, z.

Foo.__table__.insert().execute([{'bar': 1}, {'bar': 2}, {'bar': 3}])

es ist extrem langsam im Vergleich zur Ausführung einer "rohen" SQL-Anweisung für dieselbe Aufgabe, d. h.

engine.execute("insert into foo (bar) values (1),(2),(3)")

Was ist der Grund dafür? Kann SQLA keine einzelne Bulk-Insert-Anweisung generieren und führt daher mehrere Inserts aus? Aufgrund der Geschwindigkeitsbegrenzungen des Orms brauche ich einen schnellen Weg, um mehrere tausend Zeilen auf einmal hinzuzufügen, aber die SQLA-Expression-Language-Version ist zu langsam. Muss ich den rohen SQL-Code also selbst schreiben? Die Dokumentation ist nicht zu klar darüber.

Ich habe einen Geschwindigkeitstest mit der ORM - Einfügung, der ORM mit der vorab zugewiesenen PK und der SQLA - Masseneinfügung durchgeführt (sieheSQLA-Masseneinfügungsgeschwindigkeit) so was (https://gist.github.com/3341940):

SqlAlchemy ORM: Gesamtzeit für 500 Datensätze 9.61418914795 SekundenSqlAlchemy ORM pk angegeben: Gesamtzeit für 500 Datensätze 9.56391906738 secSQL-Chemie-Kern: Gesamtzeit für 500 Datensätze 9,5362598896 SekundenSQLAlchemy RAW-String-Ausführung: Gesamtzeit für 500 Datensätze 1,233677 Sekunden

Wie Sie sehen, gibt es praktisch keinen Unterschied zwischen den drei Versionen. Nur die Ausführung einer rohen Zeichenfolgeneinfügung, bei der alle Datensätze in der rohen SQL-Anweisung enthalten sind, ist erheblich schneller. Daher scheint SQLA für schnelle Einfügungen nicht optimal zu sein.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage