SQLAlchemy surowe sql vs instrukcje języka wyrażenia

Podczas wstawiania wielu wierszy do bazy danych MySQL za pomocą instrukcji SQLA-Expression-Language f.e.

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

jest wyjątkowo powolny w porównaniu z wykonaniem „surowej” instrukcji sql dla tego samego zadania, tj.

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

Jaka jest tego przyczyna? Czy SQLA nie może wygenerować pojedynczej instrukcji wstawiania zbiorczego i dlatego wykonuje wiele wstawek? Ze względu na ograniczenia prędkości orma, potrzebuję szybkiego sposobu na dodanie kilku tysięcy wierszy na raz, ale wersja języka ekspresji SQLA jest zbyt wolna. Czy muszę sam napisać surowy sql? Dokumentacja nie jest zbyt jasna.

Przeprowadziłem test prędkości z wkładką ORM, ORM ze wstępnie przypisaną PK i wkładką masową SQLA (patrzSzybkość wstawiania luzem SQLA) lubię to (https://gist.github.com/3341940):

SqlAlchemy ORM: Całkowity czas dla 500 rekordów 9.61418914795 sekSqlAlchemy ORM pk podane: Całkowity czas dla 500 rekordów 9.56391906738 sekSqlAlchemy Core: Całkowity czas dla 500 rekordów 9,5362598896 sekSQLAlchemy RAW String Execution: Całkowity czas dla 500 rekordów 1.233677 sek

Jak widać, praktycznie nie ma różnicy między trzema wersjami. Tylko wykonanie surowej wstawki ciągu, gdzie wszystkie rekordy są zawarte w surowej instrukcji sql, jest znacznie szybsze. Zatem dla szybkich wstawek SQLA wydaje się nieoptymalny.

questionAnswers(1)

yourAnswerToTheQuestion