Задача массового импорта данных в pyodbc с использованием cursor.executemany( query, df.itertuples(index=False))
Я довольно новичок в Python, но дал этому серьезный удар, чтобы решить это элегантно.
Задача: я хочу импортировать рыночные данные из pandas df в таблицу sql. Существует около 7000 различных ресурсов, и у каждого есть около 4000-10000 записей на конец дня, поэтому я пытаюсь заставить работать pyndbc executemany, а не обновлять много кода для использования SQL Alchemy и опции to_sql.
Эти несколько строк кода поставили меня перед непростой задачей - и потребовалось обновить драйвер ODBC для SQL v17 для поддержки параметра index = False.
Таблица назначения SQL:
CREATE TABLE [dbo].[EOD](
[Exchange] [varchar](10) NOT NULL,
[Issue] [varchar](10) NOT NULL,
[TDate] [date] NOT NULL,
[O] [float] NOT NULL,
[H] [float] NOT NULL,
[L] [float] NOT NULL,
[C] [float] NOT NULL,
[V] [int] NOT NULL,
[Split] [float] NULL
) ON [PRIMARY]
GO
Данные: df.head()
date exchange issue open high low close volume unadj
0 2016-11-14 ASX CGC 2.96 2.97 2.880 2.90 549167.0 0.0
1 2016-11-15 ASX CGC 2.90 2.96 2.865 2.95 587456.0 0.0
2 2016-11-16 ASX CGC 2.96 2.96 2.890 2.94 666295.0 0.0
3 2016-11-17 ASX CGC 2.94 3.15 2.910 3.11 1086692.0 0.0
4 2016-11-18 ASX CGC 3.15 3.25 3.150 3.23 2043553.0 0.0
Самое близкое, что я получил, чтобы заставить это работать, согласно ниже. Однако такой подход приводит к:
('22007', '[22007] [Microsoft] [Драйвер ODBC 17 для SQL Server][SQL Server] Не удалось выполнить преобразование при преобразовании даты и / или времени из символьной строки. (241) (SQLExecDirectW)')
cursor = cnxn.cursor()
query = ("INSERT INTO [Securities].[dbo].[EOD] (Exchange, Issue, TDate, O, H, L, C, V, Split) "
"VALUES (?,?,?,?,?,?,?,?,?) " )
try:
cursor.executemany( query, df.itertuples(index=False) )
except Exception as e:
print(e)
cursor.close()
Столбец панд уже является типом даты - поэтому я не верю, что это простое преобразование типа даты (но в отчаянии попробовал преобразование ниже)
query = ("INSERT INTO [Securities].[dbo].[EOD] (Exchange, Issue, TDate, O, H, L, C, V, Split) "
"VALUES (convert(date,?,126),?,?,?,?,?,?,?,?) " )
Будем очень благодарны за любые предложения о том, как заставить этот подход работать.
/ Лютор
1 ответ
Ваш DataFrame имеет упорядоченные столбцы "date", "exchange", "Issue", но в операторе INSERT есть упорядоченные столбцы "Exchange", "Issue", "TDate". Поэтому вы, очевидно, пытаетесь вставить коды "выдачи" ("CGC") в столбец "TDate".
Измените порядок столбцов вашего оператора INSERT, чтобы он соответствовал порядку столбцов в DataFrame.