Я использую 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')