【问题标题】:cx_Oracle executemany with a CLOBcx_Oracle executemany 与 CLOB
【发布时间】:2011-10-01 06:51:02
【问题描述】:

我正在尝试使用 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 在执行时将相应的列视为 CLOB?

【问题讨论】:

    标签: python oracle10g cx-oracle


    【解决方案1】:

    尝试将大列的输入大小设置为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)
    

    【讨论】:

      猜你喜欢
      • 2014-05-03
      • 2012-12-26
      • 2013-12-22
      • 2012-11-12
      • 2018-08-05
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多