SQLAlchemy raw sql vs expresiones de lenguaje de expresión

Al insertar varias filas en un MySQL-DB a través de una declaración SQLA-Expression-Language, es decir,

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

es extremadamente lento, en comparación con la ejecución de una instrucción SQL "sin procesar" para la misma tarea, es decir,

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

¿Cuál es la razón para esto? ¿No puede SQLA generar una sola instrucción de inserción masiva y, por lo tanto, ejecuta varias inserciones? Debido a los límites de velocidad del orm, necesito una forma rápida de agregar varios miles de filas a la vez, pero la versión SQLA-Expression-Language-Version es demasiado lenta. Entonces, ¿necesito escribir el sql crudo por mí mismo? La documentación no es muy clara sobre esto.

Realicé una prueba de velocidad con el inserto ORM, el ORM con PK preasignado y el inserto masivo SQLA (verVelocidad de inserto a granel SQLA) Me gusta esto (https://gist.github.com/3341940):

SqlAlchemy ORM: Tiempo total para 500 registros 9.61418914795 segundosSqlAlchemy ORM pk dado: Tiempo total para 500 registros 9.56391906738 seg.SqlAlchemy Core: Tiempo total para 500 registros 9.5362598896 segundosSQLAlchemy RAW String Execution: Tiempo total para 500 registros 1.233677 segundos

Como puede ver, prácticamente no hay diferencia entre las tres versiones. Solo la ejecución de una inserción de cadena sin formato, donde todos los registros se incluyen en la declaración de SQL sin formato es significativamente más rápida. Por lo tanto, para inserciones rápidas, SQLA parece sub-óptimo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta