Python支持MySQL预处理语句吗?
我之前做了一个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的回答很好地解释了它实际上做了什么。
查看MySQLdb的包评论:
在MySQLdb中,“参数化”是通过转义字符串来完成的,然后将它们直接插入到查询中,而不是使用MYSQL_STMT API。因此,unicode字符串必须经过两个中间表示(编码字符串,转义的编码字符串),才能被数据库接收。
所以答案是:不,它不支持。