更新记录时缺少右括号 (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)]
当我插入类似的值时,它工作正常。我根本无法更新我的记录。不知道那个括号在哪里不见了。我试图从 SET
和 WHERE
之间删除 ()
。它没有帮助导致同样的错误。我猜它与记录中的数据类型有某种关系。但是不知道为什么它在以类似方式插入时起作用。在哪里
str_columns is list of all columns
和
value_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
子句参数。也许我可以修复我所拥有的,但被卡住了并决定尝试不同的方法。它有效:)
我正在为缺少括号的错误而苦恼。下面是我的部分代码:
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)]
当我插入类似的值时,它工作正常。我根本无法更新我的记录。不知道那个括号在哪里不见了。我试图从 SET
和 WHERE
之间删除 ()
。它没有帮助导致同样的错误。我猜它与记录中的数据类型有某种关系。但是不知道为什么它在以类似方式插入时起作用。在哪里
str_columns is list of all columns
和
value_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
子句参数。也许我可以修复我所拥有的,但被卡住了并决定尝试不同的方法。它有效:)