使用Python将CSV文件导入SQL Server

时间:2016-10-06 14:46:29

标签: python python-3.x pymssql

我在将CSV文件上传到MS SQL Server中的表时遇到问题,CSV文件有25列,标题与SQL中的表名相同,后者也有25列。当我运行脚本时,它会抛出错误

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

将此数据导入MS SQL的最佳方法是什么? CSV和SQL表都具有完全相同的列名。

以下是代码:

import csv
import pymssql

conn = pymssql.connect(
    server="xx.xxx.xx.90",
    port = 2433,
    user='SQLAdmin',
    password='xxxxxxxx',
    database='NasrWeb'
)

cursor = conn.cursor()
customer_data = csv.reader('cleanNVG.csv') #25 columns with same header as SQL

for row in customer_data:
    cursor.execute('INSERT INTO zzzOracle_Extract([Customer Name]\
      ,[Customer #]\
      ,[Account Name]\
      ,[Identifying Address Flag]\
      ,[Address1]\
      ,[Address2]\
      ,[Address3]\
      ,[Address4]\
      ,[City]\
      ,[County]\
      ,[State]\
      ,[Postal Code]\
      ,[Country]\
      ,[Category ]\
      ,[Class]\
      ,[Reference]\
      ,[Party Status]\
      ,[Address Status]\
      ,[Site Status]\
      ,[Ship To or Bill To]\
      ,[Default Warehouse]\
      ,[Default Order Type]\
      ,[Default Shipping Method]\
      ,[Optifacts Customer Number]\
      ,[Salesperson])''VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,)',row)

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

这是CSV文件的第一行看起来像

enter image description here

3 个答案:

答案 0 :(得分:1)

您错误地使用了csv.reader.reader的第一个参数不是CSV文件的路径,而是

  

[an]对象,它支持迭代器协议并在每次调用其__next__()方法时返回一个字符串 - 文件对象和列表对象都是合适的。

因此,根据documentation中的示例,您应该做这样的事情:

import csv
with open('cleanNVG.csv', newline='') as csvfile:
    customer_data = csv.reader(csvfile)
    for row in customer_data:
        cursor.execute(sql, tuple(row))

答案 1 :(得分:1)

尝试使用d6tstackfast pandas to SQL functionality,因为它使用本机数据库导入命令。它适用于Postgres和MYSQL,MS SQL是试验性的。如果不起作用,请发表评论或提出问题。

import pandas as pd
df = pd.read_csv('cleanNVG.csv')
uri_mssql = 'mssql+pymssql://usr:pwd@localhost/db'
d6tstack.utils.pd_to_mssql(df, uri_mssql, 'table', 'schema') # experimental

对于在写入数据库之前导入具有数据模式更改的多个CSV和/或使用熊猫进行预处理也很有用,请参见examples notebook

d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'), 
    apply_after_read=apply_fun).to_mssql_combine(uri_psql, 'table')

答案 2 :(得分:0)

检查表格上的数据类型以及每个字段的大小。如果它是varchar(10)并且您的数据长度为20个字符,则会引发错误。

另外,

考虑动态构建查询以确保占位符数与表和CSV文件格式匹配。那么这只是确保您的表格和CSV文件是正确的,而不是检查您输入的内容是否正确?代码中的占位符。

以下示例假设

CSV file contains column names in the first line
Connection is already built
File name is test.csv
Table name is MyTable
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 dbo.Test 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()

但基本上,您的代码看起来很好。这是一个通用的样本。

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()