[英]cx_Oracle.DatabaseError: ORA-00907: missing right parenthesis
[英]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 進行數據庫操作的最佳方式。 這是一個非常舊的腳本,我需要修復更新問題。 不打算從頭開始寫。
好的,所以基本上括號不是約翰戈登提到的問題。 一旦我刪除它們,就會出現關於數據不一致的錯誤。 開始挖掘它,我得出結論,創建VALn=:n
的循環有問題。 我決定從那里和傳遞給 execute 方法的記錄中刪除 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
子句參數。 可能我可以修復我所擁有的,但被卡住並決定嘗試不同的方法。 有用 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.