在 Python 中使用 cx_Oracle 和 xlrd 列出列表的 executemany() 正在返回 TypeError
Posted
技术标签:
【中文标题】在 Python 中使用 cx_Oracle 和 xlrd 列出列表的 executemany() 正在返回 TypeError【英文标题】:executemany() with list of lists using cx_Oracle and xlrd in Python is returning TypeError 【发布时间】:2013-11-03 08:01:36 【问题描述】:我正在尝试编写一个 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 字符是问题的原因。任何帮助仍将不胜感激。
【问题讨论】:
我遇到了类似的问题,但无法解决。你知道这里有什么问题吗? ***.com/questions/25238423/… 【参考方案1】:看起来 unicode 是整个问题。我在 for 循环中使用了print type(EMPLOYEE)
,并确认员工姓名是用 unicode 编码的,而数据库只需要一个 ascii 字符串。我使用str()
函数转换了值,一切正常。唯一的缺点是str()
命令会在员工姓名中有 unicode 字符时抛出错误,所以我很快就会研究如何将字符串转换为处理 unicode 字符。
【讨论】:
以上是关于在 Python 中使用 cx_Oracle 和 xlrd 列出列表的 executemany() 正在返回 TypeError的主要内容,如果未能解决你的问题,请参考以下文章
使用Python解决Cx_Oracle查询时UnicodeDecodeError的问题
如何使用 cx_Oracle 在 Python 中返回 SQLPLUS 变量
在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录