2016-10-07 5 views
0

Так что я борелся с этой проблемой последние пару дней. Мне нужно загрузить CSV-файл с примерно 25 столбцами & 50K строк в таблицу SQL Server (zzzOracle_Extract), которая также содержит 25 столбцов, те же имена столбцов & в том же порядке.CSV-данные приводят к ошибке при загрузке в таблицу SQL через Python

Это то, что строка выглядит из файла CSV:

['M&M OPTICAL SHOP', '3001211', 'SHORE', '*', 'PO BOX 7891', '', '', '', 'GUAYNABO', 'GUAYNABO', 'PR', '0090', 'United States', '24-NSH RETAIL CUSTOMER', 'SH02-SHORE COLUMN 2', '3001211', '*', '*', '*', '3001211744-BILL_TO', '', '', '', '', 'RACHAEL'] 

Таким образом, в общей сложности, есть 25 столбцов с некоторыми значениями являются пустыми. Возможно, это вызывает ошибку. Вот мой код:

import csv 
import pymssql 

conn = pymssql.connect(
    server="xxxxxxxxxx", 
    port = 2433, 
    user='SQLAdmin', 
    password='xxxxx', 
    database='NasrWeb' 
) 

with open('cleanNVG.csv','r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 
    query = 'insert into dbo.zzzOracle_Extract({0}) Values({1})' 
    query = query.format(','.join(columns),','.join('?' * len(columns))) 
    cursor = conn.cursor() 
    for data in reader: 
     print(data) #What a row looks like 
     cursor.execute(query,data) 
    cursor.commit() 

cursor.close() 
print("Done") 
conn.close() 

После того, как скрипт выполняется, один из ошибок, которые я получаю следующее:

ValueError: 'params' arg (<class 'list'>) can be only a tuple or a dictionary. 

Что может быть не так с моим кодом? Я очень ценю помощь!

+2

Попробуйте 'cursor.execute (запрос, кортеж (данные))' –

+0

Я устал это, но он все еще бросил ошибку и новую, (102, б "Неправильный синтаксис около„Имя“ .DB-Lib сообщение об ошибке 20018, серьезность 15: \ nОбщая ошибка SQL Server: проверка сообщений с SQL Server \ n ") – Cesar

+0

Имеются ли в ваших именах полей пробелы? Если они это сделают, они должны быть заключены в квадратные скобки в вашем SQL. –

ответ

1

How do join the [ ] to each column in my code?

Так у вас есть что-то вроде

>>> columns = ['ID','Last Name','First Name'] 

и вы используете

>>> ','.join(columns) 
'ID,Last Name,First Name' 

но теперь вам нужно обернуть имена столбцов в квадратных скобках. Это может быть сделано с

>>> ','.join('[' + x + ']' for x in columns) 
'[ID],[Last Name],[First Name]' 
+0

Спасибо @Gord Thompson Я сделал это для другого соединения. ** query.format (','. join ('[' + x + ']' для x в столбцах), ','. join ("%" + "s" для m в столбцах)) ** Теперь У меня есть запрос в скобках и для значений ** 25 "% s" **. что правильно, однако, # 16 во втором соединении должно быть **% f ** или float, как я могу сделать это исключением для второго соединения? – Cesar

+0

@Cesar re: '% f' - Я не думаю, что это необходимо. На самом деле, я не думаю, что это даже сработает. Документация [pymssql] (http: // pymssql.org/en/latest/ref/pymssql.html) говорит, что «... поскольку форматирование и преобразование типов обрабатываются внутренне, поддерживаются только заполнители'% s' и '% d'. Оба заполнителя функционально эквивалентны». Попробуйте использовать только '% s' для всех. –