SQLAlchemy raw sql vs declarações de linguagem de expressão

Ao inserir várias linhas em um banco de dados MySQL através de uma instrução SQLA-Expression-Language, por exemplo,

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

é extremamente lento, quando comparado com a execução de uma instrução sql "bruta" para a mesma tarefa, ou seja,

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

Qual é a razão para isto? O SQLA não pode gerar uma única instrução de inserção em massa e, portanto, executa várias inserções? Devido aos limites de velocidade do orm, eu preciso de uma maneira rápida de adicionar vários milhares de linhas de uma só vez, mas o SQLA-Expression-Language-Version é muito lento. Então, eu preciso escrever o sql raw sozinho? A documentação não é muito clara sobre isso.

Fiz um teste de velocidade com a inserção ORM, o ORM com PK pré-atribuída e o inserto em massa SQLA (consulteVelocidade de inserção em massa do SQLA) como isso (https://gist.github.com/3341940):

SqlAlchemy ORM: Tempo total para 500 registros 9.61418914795 segsSqlAlchemy ORM pk given: Tempo total para 500 registros 9.56391906738 segsNúcleo SqlAlchemy: Tempo total para 500 registros 9.5362598896 segSQLAlchemy Execução de String RAW: Tempo total para 500 registros 1.233677 s

Como você pode ver, praticamente não há diferença entre as três versões. Somente a execução de uma inserção de string bruta, onde todos os registros são incluídos na instrução sql bruta, é significativamente mais rápida. Assim, para inserções rápidas, o SQLA parece abaixo do ideal.

questionAnswers(1)

yourAnswerToTheQuestion