Как вставить несколько строк кадра данных pandas в Azure Synapse SQL DW с помощью pyodb c? - PullRequest
0 голосов
/ 06 мая 2020

Я использую pyodb c для установки sh соединения с Azure Synapse SQL DW. Соединение успешно установлено. Однако, когда дело доходит до вставки фрейма данных pandas в базу данных, я получаю сообщение об ошибке, когда пытаюсь вставить несколько строк в качестве значений. Однако это работает, если я вставляю строки одну за другой. Вставка нескольких строк вместе в качестве значений используется для нормальной работы с AWS Redshift и MS SQL, но не работает с Azure Synapse SQL DW. Я думаю, что Azure Synapse SQL - это T- SQL, а не MS- SQL. Тем не менее, я также не могу найти соответствующую документацию.

У меня есть pandas df с именем 'df', который выглядит следующим образом:

student_id  admission_date
    1          2019-12-12
    2          2018-12-08
    3          2018-06-30
    4          2017-05-30
    5          2020-03-11

Этот код ниже работает нормально

import pandas as pd
import pyodbc
#conn object below is the pyodbc 'connect' object

    batch_size = 1
    i = 0
    chunk = df[i:i+batch_size]
    conn.autocommit = True
    sql = 'insert INTO {} values {}'.format('myTable', ','.join(
        str(e) for e in zip(chunk.student_id.values, chunk.admission_date.values.astype(str))))
    print(sql)
    cursor = conn.cursor()
    cursor.execute(sql)

Как видите, он вставляет только 1 строку df. Итак, да, я могу l oop и вставлять одну за другой, но это занимает чертовски много времени, когда появляются фреймы данных большего размера

Этот код ниже не работает, когда я пытаюсь вставить все строки вместе импортировать pandas как pd import pyodb c

batch_size = 5
i = 0
chunk = df[i:i+batch_size]
conn.autocommit = True
sql = 'insert INTO {} values {}'.format('myTable', ','.join(
        str(e) for e in zip(chunk.student_id.values, chunk.admission_date.values.astype(str))))
print(sql)
cursor = conn.cursor()
cursor.execute(sql)

Ошибка, которую я получаю ниже:

ProgrammingError: ('42000', «[42000] [ Microsoft] [ODB C Driver 17 для SQL Server] [SQL Server] Ошибка синтаксического анализа в строке: 1, столбце: 74: неправильный синтаксис рядом с ','. (103010) (SQLExecDirectW) ")

Это пример SQL запроса для 2 строк, который завершился ошибкой:

insert INTO myTable values (1, '2009-12-12'),(2, '2018-12-12')

1 Ответ

0 голосов
/ 10 августа 2020

Это потому, что Azure Synapse SQL не поддерживает многострочную вставку через конструктор значений. Один из способов решения проблемы - объединить в цепочку «выбрать (список значений) объединить все». Ваш псевдо SQL должен выглядеть так:

insert INTO {table}
select {chunk.student_id.values}, {chunk.admission_date.values.astype(str)} union all
...
select {chunk.student_id.values}, {chunk.admission_date.values.astype(str)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...