使用python将csv文件写入SQL Server数据库

NG_*_*_21 13 python sql-server csv pyodbc

您好我正在尝试使用python将csv文件写入SQL Server数据库中的表.我传递参数时遇到错误,但手动操作时我没有遇到任何错误.这是我正在执行的代码.

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()
Run Code Online (Sandbox Code Playgroud)

错误:pyodbc.DataError:('22001','[22001] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]字符串或二进制数据将被截断.(8152)(SQLExecDirectW); [01000] [Microsoft] [ ODBC SQL Server驱动程序] [SQL Server]语句已终止.(3621)')

但是,当我手动插入值时.它工作正常

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

我确保数据库中存在TABLE,数据类型与我传递的数据一致.连接和光标也正确.行的数据类型是"列表"

Bry*_*yan 34

请考虑动态构建查询以确保占位符数与表和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()
Run Code Online (Sandbox Code Playgroud)

如果文件中未包含列名:

...
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()
Run Code Online (Sandbox Code Playgroud)