在 Python 2.7 中使用带有 mysql.connector 的参数化查询

Posted

技术标签:

【中文标题】在 Python 2.7 中使用带有 mysql.connector 的参数化查询【英文标题】:Use parameterized query with mysql.connector in Python 2.7 【发布时间】:2017-02-25 11:48:05 【问题描述】:

我正在使用 Python 2.7,mysql.connector 在 pyCharm 中运行

我需要使用here 和also here 所示的参数化查询

鉴于这些示例,下面的cursor.execute("SELECT * FROM automatedReports WHERE pythonFunctionName = %s", (function_name)) 似乎应该可以工作。

但是,当我在 pyCharm 中编写此行时,我收到此错误:

检查说:

如果我运行代码,我会收到以下错误:

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

这里是完整的代码:

class DatabaseManager():
    def get_report_settings_for_function_named(self, function_name):
        """
        Get the settings for a given report from the database based on the name of the function that was called
        to process the report

        This is how we get the, email subject and email addresses to send the report to

        :param function_name: The name of the function that was called to process the report
        :type function_name: str.
        :returns:  array -- the settings row from the database.

        """
        cnx = mysql.connector.connect(**config)
        cursor = cnx.cursor(dictionary=True)

        cursor.execute("SELECT * FROM automatedReports WHERE pythonFunctionName = %s", (function_name))

        row = cursor.fetchone()
        cursor.close()
        cnx.close()

        print cursor.statement

        return row

print DatabaseManager().get_report_settings_for_function_named('process_elation_credit_report')

我在这里做错了什么?这是旧语法吗?我不这么认为...

注意,如果我将值输入到查询字符串中,一切正常,只是不允许我使用参数。

【问题讨论】:

【参考方案1】:

当mysql尝试执行查询时,您得到的错误来自mysql。传递给cursor.execute() 的查询参数需要是一个元组,您传递的是一个值。要创建具有单个元素的元组,您需要在元素后添加逗号:

cursor.execute("SELECT * FROM automatedReports WHERE pythonFunctionName = %s", (function_name,))

否则mysql.connector 不会转义任何内容并在查询中留下文字%s

【讨论】:

我实际上刚刚看到this question 我确实修复了它,但 pyCharm 仍然显示红色错误。但是,如果我仍然运行它,它就可以工作。很奇怪,但我会接受的。谢谢 我不使用 PyCharm,所以我不知道它如何处理字符串中的 SQL。它似乎将其解析为普通 SQL,在这种情况下,%s 将是语法错误,但稍后会用转义参数替换。 啊,好的。这就说得通了。再次感谢!

以上是关于在 Python 2.7 中使用带有 mysql.connector 的参数化查询的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 2.7 中运行 MySQL 以将 CSV 加载到 MySQL -

带有 python 2.7 的 Windows 上的 Readline 功能

在 Mac OS X 10.6 上使用带有 Python 2.7 的 Google App Engine SDK

带有 Adwords API 的 Python 2.7:ImportError: cannot import name AdWordsClient

带有 Django 1.7 迁移的 Python 2.7 未绑定方法

无法在 Windows 10 上安装带有 python 2.7 的 Django 版本 1.11.22