Python 更新记录时缺少右括号(ORA-00907)
我正在努力解决缺少括号的错误。我的部分代码如下:Python 更新记录时缺少右括号(ORA-00907),python,python-3.x,sql-update,cx-oracle,Python,Python 3.x,Sql Update,Cx Oracle,我正在努力解决缺少括号的错误。我的部分代码如下: 对于记录中的r: update_query=F“更新{Schema}.{table}集(” 值\u list=list() 对于zip中的c,v(列[1:],val_list[1:]): values_list.append(F“{c}={v}”) 更新_query+=“,”.join(值_列表) 更新_query+=”),其中某些_ID=:1“ cursor.execute(更新查询,r) 从上面的查询如下: UPDATE MY_SHEMA.
对于记录中的r:
update_query=F“更新{Schema}.{table}集(”
值\u list=list()
对于zip中的c,v(列[1:],val_list[1:]):
values_list.append(F“{c}={v}”)
更新_query+=“,”.join(值_列表)
更新_query+=”),其中某些_ID=:1“
cursor.execute(更新查询,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
[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)]
记录(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
[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
之间删除()
。这无助于导致同样的错误。我猜这与记录中的数据类型有关。但是,不知道为什么它在以类似方式插入时工作。哪里
stru列是所有列的列表
和
值\u字符串的列表类似于[:1,:2,:3…]
SQL='insert into'+Schema+'.+table+'('+str_columns+')值('+value_string+')”
logger.debug('SQL语句:%s',SQL)
cursor.executemany(SQL,value,batcherrors=True)
编辑:我在插入和更新记录时验证了该记录。它们看起来一样,里面有同样的东西,用同样的方式书写
我知道这不是用python进行db操作的最佳方法。这是一个非常旧的脚本,我需要修复更新。我不会从头开始写的。好吧,基本上括号不是约翰·戈登提到的问题。一旦我删除了它们,就出现了数据不一致的错误。开始挖掘,我得出结论,创建
VALn=:n
的循环有问题。我决定从那里以及从传递给execute方法的记录中删除ID键。我把它保存在一边,并在WHERE
子句中使用它。循环现在看起来如下所示(添加了val_列表定义):
##########################
#在上面某处#
##########################
对于范围内的i(1,len(列)+1):
val_list.append(':'+str(i))
#######
#(...)#
#######
对于记录中的r:
SOME_ID=r.pop(0)#从记录中删除一些_ID。记录现在变短了
update_query=F“更新{Schema}.{table}SET”
值\u list=list()
对于zip中的c,v(列[1:],val_list[:-1]):#使用不带某些ID的列名和一个较小的:n值(因为recrod现在较短)
values_list.append(F“{c}={v}”)
更新_query+=“,”.join(值_列表)
更新_query+=F“WHERE SOME_ID='{SOME_ID}'”
cursor.execute(更新查询,r)
最后结论:
我想我被所有这些值和事实弄糊涂了,我想通过
:n
从记录本身传递WHERE
子句参数。也许我可以修复我所拥有的,但陷入困境,决定尝试不同的方法。它可以工作:)如果您能够看到它试图执行的实际的最终SQL语句,那么问题(希望如此!)将是显而易见的。您可以手动记录语句,还是有SQL调试设置来记录它?@John Gordon我正在记录update\u查询变量和r(传递给execute方法的列表)的内容。不确定oracle cursor是否会记录更多的日志实际上我认为问题要简单得多——根本不应该使用括号!语法应该类似于updatetablename SET field=:1,其中ID=:2
。在这种情况下,“缺少右括号”错误具有误导性。您确实需要括号将插入到,但不需要括号将更新。。。SET
。就像我在我的原始帖子中写的那样,我试图从SET和WHERE之间删除()。它没有帮助导致同样的错误。
实际上,我只是再次验证了前面的语句。它确实会在没有()
的情况下崩溃,但会出现另一个错误。现在它说,数据类型是不一致的。这可能表明execute方法没有以正确的方式解压值。在update\u查询中
我使用setval2=:2,VAL3=:3。。。其中VAL1=:1
可能是错误的