【问题标题】:Python cx_Oracle UpdatePython cx_Oracle 更新
【发布时间】:2015-01-10 02:08:33
【问题描述】:

在我的 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

John 是 where 子句的 str_input2

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

谁能指出我的代码有什么问题?

【问题讨论】:

    标签: python sql-update cx-oracle


    【解决方案1】:

    错误是因为您没有引用这些值。您会从 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 injection attacks,以及您没有正确引用或转义特殊字符的愚蠢错误,以及数据库引擎无法告诉您一遍又一遍地运行相同查询的性能问题,等等.

    您要做的是使用SQL parameters,而不是尝试格式化字符串。我不记得 cx_Oracle 使用哪种参数样式,但您可以 import cx_Oracle; print(cx_Oracle.paramstyle),然后查找 in the table 以找出答案。然后做类似的事情:

    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 注入攻击——仅将其转换回字符串。)

    【讨论】:

    • 非常感谢您的精彩回答!
    猜你喜欢
    • 2015-01-16
    • 2017-02-16
    • 1970-01-01
    • 2023-03-28
    • 2011-05-17
    • 2016-09-13
    • 2013-12-29
    • 2019-03-16
    • 2017-09-22
    相关资源
    最近更新 更多