我尝试使用pyodbc将相当数量(约30万行)的数据上传到数据库中。由于数据将需要每季度更新一次(从电子表格中),所以我尝试创建一种动态插入语句,以使事情更加简化。我的想法是,我可以将电子表格中每个列的标题命名为表中我希望上载相应数据的列。在
我试图做的是编写一个脚本,将工作表标题行中的列名提取出来,并将这些列名称用作变量,这样,如果我要连续从不同的excel表上载不同的数据,则无需更改任何代码:import xlrd
import numpy as np
import pyodbc
wb=xlrd.open_workbook(r"FILE")
worksheet = wb.sheet_by_name('SHEET_NAME')
num_rows = worksheet.nrows
num_cols = worksheet.ncols
header_row = 0
header_list = [worksheet.row_values(header_row)]
header_values = ", ".join([str(i) for i in [cell.value for cell in worksheet.row(header_row)]])
question_marks = ",?" * (num_cols - 1)
cell=worksheet.cell(1,1)
arr = []
for rowind in range(num_rows)[(header_row + 1):]:
arr.append([cell.value for cell in worksheet.row(rowind)])
data = np.rec.fromrecords(arr, names=header_values)
cnxn = pyodbc.connect(r"DRIVER={SQL Server};SERVER=XXXXXXXXXX
\DEV_CON1;DATABASE=GGG;UID=AAA_dbo;PWD=XXXXXXXXX;")
cursor = cnxn.cursor()
populate_db = "insert into tblSnap_TEST(" + header_values + ") values (?" + question_marks + ")"
for i in header_list:
i = data[i]
values = header_list
cursor.execute(populate_db,values)
cursor.close
cnxn.commit
cnxn.close`
当我尝试运行脚本时,收到以下错误消息:
^{pr2}$
我以前的方法是显式定义要传递的值,例如:
account_numbers = (sheet.cell(row_index, 1).value)
但就像我说的,我在这里要做的是让它不必打印出来。这就是我试图用I=data[I]来做的。我希望Python有一种方法可以识别出“account_numbers”在一个列表中(从工作表的标题创建),然后根据我上面尝试过的i = data[i]获取相应的数据。这样的解决方案有可能吗?data[i]确实为每个列返回要插入到表中的正确数据,但execute语句无法识别它。在