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

При вставке нескольких строк в базу данных MySQL -с помощью оператора 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 -слишком медленная. Итак, мне нужно написать необработанный sql самостоятельно? Документация не слишком ясна по этому поводу.

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

  • SqlAlchemy ORM :Общее время для 500 записей 9,61418914795 с
  • SqlAlchemy ORM pk задано :Общее время для 500 записей 9,56391906738 с
  • SqlAlchemy Core :Общее время для 500 записей 9,5362598896 с
  • SQLAlchemy RAW String Execution :Общее время для 500 записей 1,233677 с

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

9
задан Community 23 May 2017 в 12:08
поделиться