在 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的问题

使用 Python 设置 cx_Oracle 环境变量

如何使用 cx_Oracle 在 Python 中返回 SQLPLUS 变量

在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录

Cx_oracle:在 python 中使用变量的 To_date

使用 Python 和 Cx_Oracle 调用带有 XMLTYPE 输入和输出参数的 Oracle 存储过程