Запись csv файла в базу данных SQL Server с использованием python

Привет, Я пытаюсь написать файл csv в таблицу в базе данных SQL Server с помощью python. Я сталкиваюсь с ошибками при передаче параметров, но я не сталкиваюсь с какой-либо ошибкой, когда делаю это вручную. Вот код, который я выполняю.
cur=cnxn.cursor() # Get the cursor
csv_data = csv.reader(file(Samplefile.csv')) # Read the csv
for rows in csv_data: # Iterate through csv
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",rows)
cnxn.commit()

Ошибка: pyodbc.DataError: ('22001', '[22001] [Microsoft] [драйвер SQL Server ODBC] [SQL Server] Строковые или двоичные данные будут усечены. (8152) (SQLExecDirectW); 01000] [Microsoft] [драйвер SQL-сервера ODBC] [SQL Server] Оператор завершен. (3621) ')

Однако, когда я вставляю значения вручную. Он отлично работает

cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",'A','B','C','D')

Я убедился, что ТАБЛИЦА существует в базе данных, типы данных соответствуют данным, которые я передаю. Соединение и курсор также верны. Тип данных строк - это "список"

Ответ 1

Рассмотрите возможность динамического построения запроса, чтобы убедиться, что количество заполнителей соответствует вашей таблице и формату файла CSV. Тогда нужно просто убедиться, что ваша таблица и CSV файл верны, вместо того, чтобы проверить, что вы набрали достаточно ? заполнители в вашем коде.

В следующем примере предполагается

  1. CSV файл содержит имена столбцов в первой строке
  2. Соединение уже построено
  3. Имя файла test.csv
  4. Имя таблицы - MyTable
  5. Python 3
...
with open ('test.csv', 'r') as f:
    reader = csv.reader(f)
    columns = next(reader) 
    query = 'insert into MyTable({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    cursor = connection.cursor()
    for data in reader:
        cursor.execute(query, data)
    cursor.commit()

Если имена столбцов не включены в файл:

...
with open ('test.csv', 'r') as f:
    reader = csv.reader(f)
    data = next(reader) 
    query = 'insert into MyTable values ({0})'
    query = query.format(','.join('?' * len(data)))
    cursor = connection.cursor()
    cursor.execute(query, data)
    for data in reader:
        cursor.execute(query, data)
    cursor.commit()

Ответ 2

Вы можете передать столбцы в качестве аргументов. Например:

for rows in csv_data: # Iterate through csv
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)", *rows)

Ответ 3

Я разобрался. Ошибка произошла из-за ограничения размера таблицы. Он изменил емкость колонки, например, с col1 varchar (10) на col1 varchar (35) и т.д.