Начиная с SQLAlchemy 1.3.0, выпущенного 2019-03-04,
sqlalchemy теперь поддерживает engine = create_engine(sqlalchemy_url, fast_executemany=True)
для диалекта mssql+pyodbc
.Т.е.
больше не нужно определять функцию и использовать
@event.listens_for(engine, 'before_cursor_execute').
Однако, когда я пытаюсь записать простой тестовый фрейм данных в mssql , возвращается ошибка:
DBAPIError: (pyodbc.Error) ('HY010', '[HY010] [Microsoft] [Драйвер ODBC 17 для SQL Server] Ошибка последовательности функций (0) (SQLParamData)') [SQL: INSERT INTO fast_executemany_test ([Дата], [A], [B], [C], [D]) ЗНАЧЕНИЯ (?,?,?,?,?)] [Параметры: ((datetime.datetime (2018, 1, 3, 0, 0), 2.0, 1.0, 1.0, «Джо»), (datetime.datetime (2018, 1, 4, 0, 0), 2.0, 1.0, 2.0, «Джо»), (datetime.datetime(2018, 1, 5, 0, 0), 2.0, 3.0, 1.0, «Пит»), (datetime.datetime (2018, 1, 6, 0, 0), 2.0, 1.0, 5.0, «Мэри»))] (Справочная информация об этой ошибке: http://sqlalche.me/e/dbapi)
Я просмотрел документацию, но не смог найти, что я делаю не так.
import sqlalchemy
import pandas as pd
DataFrame contains datetime, float, float, float, string.
test_columns = ['Date', 'A', 'B', 'C', 'D']
test_data = [
[datetime(2018, 1, 3), 2.0, 1.0, 1.0, 'Joe'],
[datetime(2018, 1, 4), 2.0, 1.0, 2.0, 'Joe'],
[datetime(2018, 1, 5), 2.0, 3.0, 1.0, 'Pete'],
[datetime(2018, 1, 6), 2.0, 1.0, 5.0, 'Mary'],
]
I am establishing connection as:
sqlUrl='mssql+pyodbc://ID:PASSWORD' + 'SERVER_ADDRESS' + '/' + 'DBName' + '?driver=ODBC+Driver+17+for+SQL+Server'
sqlcon = sqlalchemy.create_engine(sqlUrl,fast_executemany=True)
if sqlcon:
test_data.to_sql('FastTable_test', sqlcon, if_exists='replace',index=False)
print('Successfully written!')
It creates the table but due to error does not write any data into it.