在Python 2.7中将值分配给List中的变量

时间:2014-12-30 23:11:17

标签: python pyodbc xlrd

我尝试使用pyodbc将相当数量(〜300k行)的数据上传到数据库。由于数据需要每季度更新一次(来自电子表格),我试图创建的是一种动态插入语句,以使事情更加简化。我的思维过程是,我可以将电子表格中每列的标题命名为与我希望上传相应数据的表格中的列相同。

我尝试做的是编写一个脚本,在工作表的标题行中提取列名并将其用作变量,如果我没有更改任何代码,我就不需要这样做。 m从不同的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`

当我尝试运行脚本时,收到以下错误消息:

File "<ipython-input-45-6809dc4a27ac>", line 1, in <module>
runfile('H:/My Documents/Python/string_search_test.py', wdir='H:/My Documents/Python')

File "C:\Users\xxxx\xxx\xx\x\Anaconda\lib\site-                                                    packages\spyderlib\widgets\externalshell\sitecustomize.py", line 580, in runfile
execfile(filename, namespace)

File "H:/My Documents/Python/string_search_test.py", line 67, in <module>
cursor.execute(populate_db,values)

ProgrammingError: ('The SQL contains 21 parameter markers, but 1 parameters were supplied', 'HY000')

之前我做过的方法是明确定义要传递的值,例如:

account_numbers = (sheet.cell(row_index, 1).value)

但就像我说的那样,我在这里尝试做的就是这样做,所以我不打算这样做。这就是我试图用i = data [i]做的事情。我希望Python有一种方法可以识别&#34; account_numbers&#34;在列表中(根据工作表的标题创建),然后根据我在上面尝试的类似于i = data[i]的内容获取相应的数据。这样的解决方案可能吗? data [i]确实返回我想要插入到每个列的表中的正确数据,但它不能被execute语句识别。

2 个答案:

答案 0 :(得分:1)

如果您没有处理大型Excel工作表或任何有问题的数据类型(例如Dates in Excel spreadsheets部分中描述的那些),您可以简化将所有行读取到单个列表中,弹出标题值插入列,然后调用Cursor.executemany一次以插入电子表格中的所有值,传递参数值的序列序列。

我删除了numpy数组,因为在提供的代码段中没有必要。

header_row = 0

# build list of lists that represents row values in worksheet,
# including column names from header row
rows = [worksheet.row_values(row) for row in range(worksheet.nrows)]

# extract list of column names to use for insert statement, values to be inserted remain
columns = rows.pop(header_row)

cnxn = pyodbc.connect(r"DRIVER={SQL Server};SERVER=XXXXXXXXXX\DEV_CON1;DATABASE=GGG;UID=AAA_dbo;PWD=XXXXXXXXX;")
cursor = cnxn.cursor()

# list of column names used to build SQL statement, including parameter placeholders (?)
populate_db = "insert into tblSnap_TEST ({}) values ({})".format(', '.join(columns),
                                                                 ', '.join('?' * len(columns)))

# insert is executed once for each sequence of parameter values
cursor.executemany(populate_db, rows)
cnxn.commit()
cnxn.close()

答案 1 :(得分:0)

也许

cursor.execute(populate_db,*values)

这称为解包列表(或其他可迭代的)