在Python中使用cx_Oracle和xlrd的带有列表列表的executemany()返回TypeError
作者:互联网
我正在尝试编写一个Python脚本,该脚本将从Excel文档中读取数据,然后将其写入Oracle数据库中的单个表中.我目前正在使用xlrd从Excel文档中读取,并使用cx_Oracle将数据插入数据库中.
我以前使用嵌套的for循环结构来完成此操作,以遍历Excel doc中的每一列,将每一列的值存储在变量中,将值插入表中,然后对每一行执行此操作.但是,这对于几千行数据而言效率很低,我正在使用带有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(查询,行)(在读取的数据的最后一行上执行一次插入)时,查询执行得非常好,所以我认为参数列表的格式设置存在问题,而不是查询串.但是,我的参数按照this tutorial正确设置了格式,有人可以帮助我理解为什么我的代码不起作用吗?
更新:因此,我尝试将一些数据手动插入到rows变量中,以查看格式化是否已关闭,并删除了unicode字符:
rows = [['Employee 1', 10000.0, 8.0], ['Employee 1', 10001.0, 8.0], ['Employee 1', 10002.0, 8.0]]
插入这三个条目效果很好,因此我目前正在调查Unicode字符是否是问题的原因.任何帮助仍将不胜感激.
解决方法:
看来unicode就是整个问题.我在for循环中使用了打印类型(EMPLOYEE),并确认员工名称是使用unicode编码的,而数据库只是希望使用ascii字符串.我使用str()函数转换了值,并且一切正常.唯一的缺点是,如果员工姓名中实际包含Unicode字符,则str()命令将引发错误,因此我很快就会考虑将字符串实际转换为处理Unicode字符.
标签:xlrd,cx-oracle,executemany,python 来源: https://codeday.me/bug/20191122/2061005.html