Обезьяны Pandas с включенным быстрым исполнением:
ет на мой вопросКак ускорить обработку данных LOT в Python + Pandas + sqlAlchemy + MSSQL / T-SQL Я был любезно направлен наУскорение панд. DataFrame.to_sql с fast_executemany pyODBC @ IljaEverilä.
Примечание: в целях тестирования я читаю / пишу только 10 тыс. Строк.
Я добавил прослушиватель событий и а) функция вызывается, но б) ясно, что executemany не установлено, так как IF не работает, а cursor.fast_executemay не установлено.
def namedDbSqlAEngineCreate(dbName):
# Create an engine and switch to the named db
# returns the engine if successful and None if not
# 2018-08-23 added fast_executemany accoding to this https://stackoverflow.com/questions/48006551/speeding-up-pandas-dataframe-to-sql-with-fast-executemany-of-pyodbc?rq=1
engineStr = 'mssql+pyodbc://@' + defaultDSN
engine = sqla.create_engine(engineStr, echo=False)
@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
# print("FUNC call")
if executemany:
print('executemany')
cursor.fast_executemany = True
try:
engine.execute('USE ' +dbName)
return(engine)
except sqla.exc.SQLAlchemyError as ex:
if ex.orig.args[0] == '08004':
print('namedDbSqlAEngineCreate:Database %s does not exist' % dbName)
else:
print(ex.args[0])
return(None)
Естественно, нет изменений в скорости.
Код в моем исходном вопросе неизменен в to_sql
nasToFillDF.to_sql(name=tempTableName, con=engine.engine, if_exists='replace', chunksize=100, index=False)
потому что я попытался, в соответствии с примером, установить chunksize = None и получить сообщение об ошибке (с которым я столкнулся ранее)
(pyodbc.ProgrammingError) («SQL содержит маркеры параметров -31072, но предоставлено 100000 параметров», «HY000»)
Что я сделал не так? Я предполагаю, что параметр executemany в receive_before_cursor_execute не установлен, но если это ответ, я понятия не имею, как это исправить.
Программа установки pyodbc 4.0.23, sqlAchemy 1.2.6, Python 3.6.