3

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

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

我目前正在使用此代码将数据加载到列表列表中,然后调用 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),所以我认为参数列表的格式化方式有问题,而不是查询字符串。但是,根据本教程,我的参数显示正确格式有人可以帮助我理解为什么我的代码不起作用吗?

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

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

插入这三个条目工作得很好,所以我目前正在调查 unicode 字符作为问题的原因。任何帮助仍将不胜感激。

4

1 回答 1

3

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

于 2013-10-24T15:25:24.740 回答