在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字符.

上一篇:基于微信的座位预约预订小程序(java后台springboot框架)、毕业设计、开题报告、毕业论文参考(7)数据库设计


下一篇:MYSQL的基础用法