Задача массового импорта данных в pyodbc с использованием cursor.executemany (query, df.itertuples (index = False)) - PullRequest
0 голосов
/ 26 декабря 2018

Я довольно новичок в python, но дал этому серьезный удар, чтобы решить эту проблему элегантно.

Задача: я хочу импортировать рыночные данные из pandas df в таблицу sql.Существует около 7000 различных ресурсов, и у каждого по 4000-10000 записей на конец дня, поэтому я пытаюсь заставить работать pymanbc 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),?,?,?,?,?,?,?,?) " )

Будем весьма благодарны за любые предложения о том, как заставить этот подход работать.

/ Luthor

1 Ответ

0 голосов
/ 27 декабря 2018

В вашем DataFrame есть упорядоченные столбцы «date», «exchange», «issue», но в вашем операторе INSERT есть упорядоченные столбцы «Exchange», «Issue», «TDate».Поэтому вы, очевидно, пытаетесь вставить коды «выдачи» («CGC») в столбец «TDate».

Измените порядок столбцов оператора INSERT, чтобы он соответствовал порядку столбцов в DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...