带有CLOB的cx峎Oracle执行器

2024-09-28 16:59:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用cx峎Oracle解析多个csv并将它们的数据插入表中。我可以使用execute将数据插入表中,但是当我尝试使用executemany执行相同的过程时,我得到了一个错误。我使用execute的代码是

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)

但是当我用

^{pr2}$

当试图插入一个包含CLOB列且数据超过4000字节的表时,我得到“ValueError:stringdata too large”。当表没有CLOB列时,Executemany工作得很好。当你告诉我,当你把列当作一个合适的方法来处理时,clouty可以告诉你吗?在


Tags: csv数据keyinforexecutedata过程
1条回答
网友
1楼 · 发布于 2024-09-28 16:59:42

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

相关问题 更多 >