SQLAlchemy raw sql против операторов языка выражений

При вставке нескольких строк в MySQL-DB с помощью оператора SQLA-Expression-Language, например

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

он чрезвычайно медленный по сравнению с выполнением «необработанного» SQL заявление для той же задачи, т.е.

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

Что является причиной этого? Может ли SQLA генерировать один оператор массовой вставки и, следовательно, выполнять несколько операций вставки? Из-за ограничений скорости orm, мне нужен быстрый способ добавить несколько тысяч строк одновременно, но версия SQLA-Expression-Language-Version слишком медленная. Итак, мне нужно написать raw sql самостоятельно? Документация не слишком ясна по этому поводу.

Я выполнил тест скорости со вставкой ORM, ORM с предварительно назначенным PK и массовой вставкой SQLA (см.Скорость массовой вставки SQLA) как это (https://gist.github.com/3341940):

SqlAlchemy ORM: Total time for 500 records 9.61418914795 secs SqlAlchemy ORM pk given: Total time for 500 records 9.56391906738 secs SqlAlchemy Core: Total time for 500 records 9.5362598896 secs SQLAlchemy RAW String Execution: Total time for 500 records 1.233677 secs

Как видите, между этими тремя версиями практически нет различий. Только выполнение вставки необработанной строки, где все записи включены в необработанный оператор SQL, значительно быстрее. Таким образом, для быстрой вставки SQLA кажется неоптимальным.

Ответы на вопрос(1)

Ваш ответ на вопрос