Python支持MySQL预处理语句吗?

52 投票
7 回答
57546 浏览
提问于 2025-04-15 17:17

我之前做了一个PHP项目,使用预处理语句后,SELECT查询速度提高了20%。

我在想,这种方法在Python中也有效吗?我找不到明确说明它是否有效的信息。

7 个回答

10

我快速看了一下MySQLdb包中的Cursor对象的execute()方法(这个包是用来和MySQL数据库连接的,算是一个常用的包吧),发现它似乎(至少默认情况下)只做字符串插值和引号处理,并不是真正的参数化查询:

if args is not None:
    query = query % db.literal(args)

如果这不是字符串插值,那它是什么呢?

在使用executemany的时候,它实际上是尝试把插入或替换操作作为一个整体来执行,而不是一个个循环执行。就这样,没有什么特别的地方,似乎至少在默认情况下是这样。

编辑:哦,我刚意识到,取模运算符是可以被重写的,但我觉得这样有点作弊,于是我搜索了一下源代码。不过没有找到重写的mod

59

大多数编程语言都有一种方法来处理通用的参数化语句,Python也不例外。当使用参数化查询时,支持准备语句的数据库会自动处理这些查询。

在Python中,参数化查询的写法是这样的:

cursor.execute("SELECT FROM tablename WHERE fieldname = %s", [value])

具体的参数化风格可能会根据你使用的数据库驱动不同而有所变化。你可以导入你的数据库模块,然后运行 print yourmodule.paramstyle 来查看。

来自 PEP-249 的内容:

paramstyle

       String constant stating the type of parameter marker
       formatting expected by the interface. Possible values are
       [2]:

           'qmark'         Question mark style, 
                           e.g. '...WHERE name=?'
           'numeric'       Numeric, positional style, 
                           e.g. '...WHERE name=:1'
           'named'         Named style, 
                           e.g. '...WHERE name=:name'
           'format'        ANSI C printf format codes, 
                           e.g. '...WHERE name=%s'
           'pyformat'      Python extended format codes, 
                           e.g. '...WHERE name=%(name)s'
15

直接回答,不,它不支持。

joshperry的回答很好地解释了它实际上做了什么。

来自eugene y对类似问题的回答

查看MySQLdb的包评论

在MySQLdb中,“参数化”是通过转义字符串来完成的,然后将它们直接插入到查询中,而不是使用MYSQL_STMT API。因此,unicode字符串必须经过两个中间表示(编码字符串,转义的编码字符串),才能被数据库接收。

所以答案是:不,它不支持。

撰写回答