我正在尝试使用 cx_Oracle 解析多个 CSV 并将其数据插入到表中。我使用execute 插入到表中没有问题,但是当我使用executemany 尝试相同的过程时,出现错误。我使用有效的执行代码是
with open(key,'r') as file:
for line in file:
data = data.split(",")
query = "INSERT INTO " + tables[key] + " VALUES ("
for col in range(len(data)):
query += ":" + str(col) + ","
query = query[:-1] + ")"
cursor.execute(query, data)
但是当我用
替换它时with open(key,'r') as file:
list = []
for line in file:
data = data.split(",")
list.append(data)
if len(list) > 0:
query = "INSERT INTO " + tables[key] + " VALUES ("
for col in range(len(data)):
query += ":" + str(col) + ","
query = query[:-1] + ")"
cursor.prepare(query)
cursor.executemany(None,list)
尝试插入具有 CLOB 列且数据超过 4000 字节的表时,出现“ValueError:字符串数据太大”。当表没有 CLOB 列时,Executemany 效果很好。有没有办法告诉cx_Oracle 在执行many 时将适当的列视为CLOB?
最佳答案
尝试将大列的输入大小设置为cx_Oracle.CLOB
。如果您有二进制数据,则可能不起作用,但应该适用于 CSV
中的任何文本。 2K
值可能低于其需要的值。
请注意,当涉及 CLOB
列时,executemany
似乎要慢很多,但仍然比重复执行要好:
def _executemany(cursor, sql, data):
'''
run the parameterized sql with the given dataset using cursor.executemany
if any column contains string values longer than 2k, use CLOBS to avoid "string
too large" errors.
@param sql parameterized sql, with parameters named according to the field names in data
@param data array of dicts, one per row to execute. each dict must have fields corresponding
to the parameter names in sql
'''
input_sizes = {}
for row in data:
for k, v in row.items():
if isinstance(v, basestring) and len(v) > 2000:
input_sizes[k] = cx_Oracle.CLOB
cursor.setinputsizes(**input_sizes)
cursor.executemany(sql, data)
关于python - cx_Oracle 使用 CLOB 执行many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624991/