python - 更新记录时缺少右括号 (ORA-00907)
问题描述
我正在努力解决缺少括号的错误。我的部分代码如下:
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
and之间删除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 进行数据库操作的最佳方式。这是一个非常古老的脚本,我需要修复更新的东西。不打算从头开始写。
解决方案
好的,所以基本上括号不是约翰戈登提到的问题。一旦我删除它们,就会出现关于数据不一致的错误。开始挖掘它,我得出结论,创建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)
最终结论:我想我对所有这些值感到困惑,事实上我想将WHERE
记录本身的子句参数传递给:n
. 可能我可以修复我所拥有的,但被卡住并决定尝试不同的方法。有用 :)
推荐阅读
- r - 是否可以在可反应库中创建双列名称?
- c# - Newtonsoft Json List 序列化返回 $id
- c++ - Static local variable and auto
- c# - 反序列化 JSON 字典
- typescript - 如何键入来自 realmDB 的对象数组?
- javascript - 使用 Puppeteer 检索网页上所有 HTML IMG 标签的 SRC 属性
- azure - AKS 中用于多区域存储的正确 PVC 配置是什么?
- angular - ngb popover不呈现html编码
- python - 使用networkx获取最短路径,但通过路径应该经过的额外站点
- firebase - events_* 表 bigquery 中的“privacy_info”是什么?