[英]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()
,它返回一个字符串,而不是使用input
来eval
该字符串-带来了与上述SQL注入攻击相同的安全性问题—仅将其转换回字符串。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.