更新记录时缺少右括号 (ORA-00907)

missing right parenthesis (ORA-00907) while updating the record

我正在为缺少括号的错误而苦恼。下面是我的部分代码:

for r in Records:
    update_query = F"UPDATE {Schema}.{table} SET ("
    values_list = list()

    for c, v in zip(columns[1:], val_list[1:]):
        values_list.append(F"{c}={v}")
    update_query += ", ".join(values_list)
    update_query += ") WHERE SOME_ID=:1"
    cursor.execute(update_query, r)

上面的查询如下:

UPDATE MY_SHEMA.MY_TABLE SET (VAL2=:2, VAL3=:3, VAL4=:4, VAL5=:5, VAL6=:6, VAL7=:7, VAL8=:8, VAL9=:9, VAL10=:10, VAL11=:11, VAL12=:12, VAL13=:13, VAL14=:14, VAL15=:15, VAL16=:16, VAL17=:17) WHERE VAL1=:1

记录 (r) 如下所示:

[11111, 'some_string', 'some longer string', 4, 'another', 1, '', datetime.datetime(2020, 4, 16, 1, 25, 38), 'some-other-string', 'another string', 7.5, 5.5, 'some:complex/string/with/some/:values', 9.8, 8.5, 'another:complex/string/with/some/:values', datetime.datetime(2020, 11, 4, 17, 43, 23)]

当我插入类似的值时,它工作正常。我根本无法更新我的记录。不知道那个括号在哪里不见了。我试图从 SETWHERE 之间删除 ()。它没有帮助导致同样的错误。我猜它与记录中的数据类型有某种关系。但是不知道为什么它在以类似方式插入时起作用。在哪里 str_columns is list of all columnsvalue_string is list like [:1,:2,:3...]

SQL = 'insert into ' + Schema + '.' + table + ' (' + str_columns + ') values (' + value_string + ')'
    logger.debug('SQL statement: %s', SQL)
    cursor.executemany(SQL, values, batcherrors=True)

编辑: 我在记录插入和更新时验证了记录。它们看起来一样,里面有相同的对象,用相同的方式编写。

我知道这不是使用 python 进行数据库操作的最佳方式。这是一个非常古老的脚本,我需要修复更新问题。不打算从头开始写。

好吧,基本上括号不是 John Gordon 提到的问题。一旦我删除它们,就会出现关于数据不一致的错误。开始挖掘它,我得出结论,创建 VALn=:n 的循环有问题。我决定从那里和传递给执行方法的记录中删除 ID 键。我把它放在一边并在 WHERE 子句中使用它。循环现在看起来如下(添加了 val_list 定义):

##########################
#     Somewhere above    #
##########################
for i in range(1, len(columns)+1):
    val_list.append(':'+ str(i))

#######
#(...)#
#######


for r in Records:
    SOME_ID = r.pop(0)  # Remove some_id from the record. The record is now shorter
    update_query = F"UPDATE {Schema}.{table} SET "
    values_list = list()

    for c, v in zip(columns[1:], val_list[:-1]):  # take column names w/o SOME_ID and one less :n value (as recrod is shorter now)
        values_list.append(F"{c}={v}")

    update_query += ", ".join(values_list)
    update_query += F" WHERE SOME_ID='{SOME_ID}'"
    cursor.execute(update_query, r)

最终结论: 我想我对所有这些值感到困惑,事实上我想通过 :n 从记录本身传递 WHERE 子句参数。也许我可以修复我所拥有的,但被卡住了并决定尝试不同的方法。它有效:)