在Python中使用cx_Oracle和xlrd的列表列表的executemany()返回TypeError

时间:2013-10-24 14:34:29

标签: python xlrd cx-oracle executemany

我正在尝试编写一个Python脚本,该脚本将从Excel文档中读取数据,然后将其写入Oracle数据库中的单个表。我目前正在使用xlrd来读取Excel文档和cx_Oracle以将数据插入数据库。

我之前使用嵌套的for循环结构来完成此操作,遍历Excel文档中的每一列,将每个列值存储在变量中,将值插入表中,然后对每一行执行此操作。但是,对于几千行数据来说,这是相当低效的,我希望使用带有cx_Oracle

executemany()语句来实现这一点。

我目前正在使用此代码将数据加载到列表列表中,然后调用executemany()命令:

rows = [] 
for rownum in range (sh1.nrows):
        column_value = sh1.row_values(rownum)
        EMPLOYEE = column_value[1]
        ITEM_DATE = column_value[2]
        HOURS = column_value[3]
        row = [EMPLOYEE, ITEM_DATE, HOURS]
        rows.append(row)

query ="""INSERT INTO TABLE1 (EMPLOYEE, ITEM_DATE, HOURS) VALUES (:1, :2, :2)"""
# executemany by passing list rows with tuples (EMPLOYEE, ITEM_DATE, HOURS)
cursor.executemany(query, rows)

行列表如下所示:

[[u'Employee 1', 10000.0, 8.0], [u'Employee 1', 10001.0, 8.0], [u'Employee 1', 10002.0, 8.0]....]
# I have disguised the names and numbers here

但是,我在执行executemany()语句时遇到类型错误:

cursor.executemany(query, rows)
TypeError: expecting string, unicode or buffer object

执行cursor.execute(query, row)(在读取的最后一行数据上执行单个插入)时查询执行得非常好,所以我认为参数列表的格式化方式有问题,而不是查询串。但是,根据this tutorial,我的参数显示格式正确。任何人都可以帮我理解为什么我的代码无效吗?

更新:所以我尝试手动将一些数据插入rows变量以查看我的格式是否已关闭,并取消了unicode字符:

rows = [['Employee 1', 10000.0, 8.0], ['Employee 1', 10001.0, 8.0], ['Employee 1', 10002.0, 8.0]]

插入这三个条目工作正常,所以我目前正在调查unicode字符作为问题的原因。任何帮助仍然会受到赞赏。

1 个答案:

答案 0 :(得分:3)

看起来unicode就是整个问题。我在for循环中使用print type(EMPLOYEE)并确认员工名称是用unicode编码的,而数据库只是期望一个ascii字符串。我使用str()函数转换了值,一切正常。唯一的缺点是,如果员工名称中实际存在unicode字符,str()命令将抛出错误,因此我将很快研究实际转换字符串以处理unicode字符。