【问题标题】:Python cx_Oracle. banging head with executemany()Python cx_Oracle。用 executemany() 敲头
【发布时间】:2013-12-22 09:09:02
【问题描述】:

我昨天大部分时间都在这里和网络上查看问题,但仍然无法真正弄清楚我错过了什么。我很确定这一定是非常愚蠢的事情,但我现在已经筋疲力尽了。

所以,代码:

temp_table_name = 'COMPTEMP.i'+todo_name+'_MSGRUN'
sql_create_table = "CREATE TABLE "+temp_table_name+" (CL VARCHAR2(255)) NOLOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING"
DB_GATEWAY.execute(sql_create_table)

(创建成功)

sql_fill_table_header = """INSERT INTO """+temp_table_name+""" (CL) VALUES (:1)"""
sql_fill_table_build = []
sql_fill_table_build = ['1', '2', '3', '4', '55']

DB_GATEWAY.executemany(sql_fill_table_build, sql_fill_table_header)

(现在转到会话池守卫,它在下面结束)

def executemany( self, db_operation, db_prepare ):
    self.cursor_.prepare(db_prepare)
    self.cursor_.executemany(None, db_operation)

运行时出现以下错误

OracleException:  ORA-01036: illegal variable name/number

如果我从列表中删除值“55”,所有其他值都可以正常插入,所以看起来它只接受 1 个字符长度的值。

当我单独通过 execute() 运行每个语句时,它们会被插入。我很确定它必须与代码或 Oracle 如何处理位置参数有关,但我现在迷路了。

感谢您的帮助!

【问题讨论】:

    标签: python cx-oracle executemany


    【解决方案1】:

    executemany() 需要 的序列;列表中的条目本身必须是参数序列,即使插入的行每行仅包含一个值:

    sql_fill_table_build = [('1',), ('2',), ('3',), ('4',), ('55',)]
    

    或使用列表:

    sql_fill_table_build = [['1'], ['2'], ['3'], ['4'], ['55']]
    

    它只适用于字符串的平面列表减去'55' 条目的原因是因为字符串也是序列,但'55' 是长度为2 的序列。因此,最后一个条目尝试插入 两个 参数,'5''5',但您的查询只需要一个参数。

    如果某些 API 只为您提供了一个平面列表,您可以将平面列表转换为嵌套序列,并在插入时使用列表推导:

    DB_GATEWAY.executemany(sql_fill_table_build, [(v,) for v in sql_fill_table_header])
    

    我没有用cx_Oracle 测试过这个,但是一些数据库适配器也接受一个可迭代的,所以生成器表达式可能更有效:

    DB_GATEWAY.executemany(sql_fill_table_build, ((v,) for v in sql_fill_table_header))
    

    cx_Oracle 可能需要一个序列。

    【讨论】:

    • 谢谢,这有助于解决问题!
    • 不幸的是 cx_Oracle 坚持使用列表;不允许生成器:(
    • @Anto:然后只需将 [...] 放在生成器表达式周围而不是 (...) 即可将其转换为列表理解。
    • @Anto:我刚刚把它放在那里供其他数据库驱动程序使用。
    • @Anto:对。我仍然希望未来的版本仍然可以接受任何可迭代的。 :-)
    猜你喜欢
    • 2012-12-26
    • 2011-10-01
    • 2018-08-05
    • 2023-03-28
    • 2019-05-02
    • 2019-10-17
    • 2013-11-03
    • 2014-05-03
    • 2021-07-17
    相关资源
    最近更新 更多