Python PYDOBC使用参数插入SQL Server DB

时间:2017-01-13 23:33:50

标签: python sql-server python-2.7 azure-sql-database pyodbc

我目前正在尝试使用pyodbc将.csv中的数据插入Azure SQL Server数据库。我在Stack Overflow上发现了大部分这种语法,但由于某种原因,我不断得到两个不同的错误之一。

1)每当我使用下面的代码时,我都会收到一条错误,指出SQL包含0个参数标记,但提供了7个参数'。

import pyodbc
import csv
cnxn = pyodbc.connect('driver', user='username', password='password', database='database')
 cnxn.autocommit = True
cursor = cnxn.cursor()
csvfile = open('CSV File')
csv_data = csv.reader(csvfile)
SQL="insert into table([Col1],[Col2],[Col3],[Col4],[Col5],[Col6],[Col7]) values ('?','?','?','?','?','?','?')"
for row in csv_data:
   cursor.execute(SQL, row)
time.sleep(1)
cnxn.commit()
cnxn.close()

2)为了摆脱这个错误,我通过添加' =?'来定义参数标记。插入语句中的每一列(请参阅下面的代码),但是这会产生以下错误:ProgrammingError:(' 42000'" [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]' =')附近的语法不正确。

import pyodbc
import csv
cnxn = pyodbc.connect('driver', user='username', password='password', database='database')
cnxn.autocommit = True
cursor = cnxn.cursor()
csvfile = open('CSV File')
csv_data = csv.reader(csvfile)
SQL="insert into table([Col1]=?,[Col2]=?,[Col3]=?,[Col4]=?,[Col5]=?,[Col6]=?,[Col7]=?) values ('?','?','?','?','?','?','?')"
for row in csv_data:
   cursor.execute(SQL, row)
time.sleep(1)
cnxn.commit()
cnxn.close()

这是我遇到麻烦的主要错误,我已经搜遍了Stack Overflow并且似乎无法找到解决方案。我知道这个错误可能非常简单,但我是Python新手,非常感谢任何建议或帮助。

2 个答案:

答案 0 :(得分:3)

由于SQL Server可以使用单个语句导入整个CSV文件,因此这是对方向盘的重新设计。

BULK INSERT my_table FROM 'CSV_FILE'
WITH ( FIELDTERMINATOR=',', ROWTERMINATOR='\n');

如果你想坚持使用pyton,只需用pyodbc执行上述查询!

如果您仍然希望执行数千条语句而不只是一条

SQL="insert into table([Col1],[Col2],[Col3],[Col4],[Col5],[Col6],[Col7]) values (?,?,?,?,?,?,?)"

请注意'周围的?{1}}不应该在那里。

答案 1 :(得分:0)

# creating column list for insertion
colsInsert = "["+"],[".join([str(i) for i in mydata.columns.tolist()]) +']'

# Insert DataFrame recrds one by one.
for i,row in mydata.iterrows():
    sql = "INSERT INTO Test (" +colsInsert + ") VALUES (" + "%?,"*(len(row)-1) + "%?)"
    cursor.execute(sql, tuple(row))
   # cursor.execute(sql, tuple(row))

    # the connection is not autocommitted by default, so we must commit to save our changes
    c.commit()