【问题标题】:Connector/Python Select statement not working连接器/Python Select 语句不起作用
【发布时间】:2015-09-30 22:08:13
【问题描述】:

谁能帮我弄清楚以下代码有什么问题。这是一个 Python 应用程序,它尝试使用 Connector/Python 从 mysql 数据库中进行选择

number = '+12345678901'
cursor.execute('SELECT * FROM channel WHERE phone_number = %s', (number))

它产生以下错误:

1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“%s”附近使用正确的语法

当我检查 mysql 日志时,我看到以下内容:

SELECT * FROM channel WHERE phone_number = %s

这意味着它没有替换电话号码。

【问题讨论】:

    标签: python mysql mysql-connector-python


    【解决方案1】:

    现在使用 str.format() 方法代替 %s

        number = '+12345678901'
        cursor.execute('SELECT * FROM channel WHERE phone_number = {}').format(number))
    

    发生在 python2.6-ish 左右,见https://docs.python.org/2/library/string.html?highlight=string.format#format-string-syntax

    【讨论】:

    • 这是将 mysql 驱动程序语句插值与 python 插值混为一谈。如果您以这种方式插入查询(python 而不是 SQL),您将面临 SQL 注入攻击。
    【解决方案2】:

    根据Python Database API,参数应该作为序列或映射提供,而(number)两者都不是。

    要创建单个元素元组,您需要在元素后加逗号。

    cursor.execute('SELECT * FROM channel WHERE phone_number = %s', (number, ))
    

    【讨论】:

    • 顺便说一句,我想您也可以使用 python 替换字符串。例如,'SELECT * FROM channel WHERE phone_number = %s' % (number)
    • @mohit 容易受到 sql 注入攻击。 Sql 查询字符串不应以这种方式连接。
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2016-07-12
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多