繁体   English   中英

Python cx_Oracle更新

[英]Python cx_Oracle Update

在我的Python代码中,当我要求用户向SELECT输入一个字符串时,它可以工作,但是当我尝试使用相同的输入进行UPDATE时,我无法执行

这是连接成功后的代码

curs = connection.cursor()
str_input1 = str(input("Input : "))
str_input2 = str(input("Input : "))
statement = "UPDATE table SET variable1 = "+str_input1+" WHERE name = "+str_input2
curs.execute(statement)
connection.commit

理论上,以下代码应该可以工作并更新变量,但我在curs.execute(statement)行中看到错误

cx_Oracle.DatabaseError: ORA-00904: John: invalid identifier

约翰是where子句的str_input2

也许它的格式给了我一个错误,但我不太确定。

有人可以指出我的代码有什么问题吗?

该错误是因为您没有引用这些值。 您将从SELECT语句中得到完全相同的错误。

这些语句搜索name列与字符串John匹配的行:

SELECT * FROM table WHERE name = "John"
UPDATE table SET variable1 = "Hi" WHERE name = "John"

这些语句搜索name列与John列匹配的行,如果没有John列,那就是错误的:

SELECT * FROM table WHERE name = John
UPDATE table SET variable1 = "Hi" WHERE name = John

因此,您可以通过在值两边加上引号解决此问题。

但是你真的,真的,真的不应该。 这使您容易遭受SQL注入攻击 ,愚蠢的bug(无法正确引用或转义特殊字符)以及性能问题(数据库引擎无法一遍又一遍地运行相同的查询),等等。 。

您要做的是使用SQL参数 ,而不是尝试格式化字符串。 我不记得cx_Oracle使用哪种参数样式,但是您可以只import cx_Oracle; print(cx_Oracle.paramstyle) import cx_Oracle; print(cx_Oracle.paramstyle) ,然后在表中查找以进行查找。 然后执行以下操作:

statement = "UPDATE table SET variable1 = :v WHERE name = :n"
curs.execute(statement, {'v': str_input1, 'n': str_input2})

另外,还有一些注意事项:

  • connection.commit不执行任何操作; 您只是在引用commit方法,而不是调用它。 您需要括号: connection.commit()
  • str(input())是没有意义的。 input函数始终返回一个字符串,因此没有理由在其上调用str (除非您使用的是Python 2.x,在这种情况下,您应该使用raw_input() ,它返回一个字符串,而不是使用inputeval该字符串-带来了与上述SQL注入攻击相同的安全性问题—仅将其转换回字符串。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM