Python MariaDB连接器是否支持使用原生Prepared Statement?
能否在Python中使用MariaDB的原生Prepared Statement?
你提到的MariaDB原生Prepared Statement是指这种先创建预编译语句对象、再复用执行的模式:
创建预编译语句对象:
prep_stmt = cursor.prepared_statement("INSERT INTO my_table (field1, field2) VALUES (%1 %2)")
之后可多次复用该对象,通过设置参数执行:
prep_stmt.set("mike", "rodent") prep_stmt.execute()
或者:
prep_stmt.set(1, "mike") prep_stmt.set(2, "rodent") cursor.execute(prep_stmt)
目前主流MariaDB Python驱动文档里常见的是这种语法:
cursor.execute( "SELECT * FROM sales WHERE sale_date >= ? and price > ?", (sale_date_val, price_val))
正如你提到的,这种写法在部分旧驱动(比如MySQLdb)里只是客户端侧的字符串格式化,并非真正的服务器端预编译。
但确实可以在Python中使用MariaDB的原生Prepared Statement,只要使用支持服务器端预编译的驱动并调用对应方法:
官方mariadb库的实现方式
- 使用
cursor.prepare()方法创建服务器端预编译语句,后续复用执行:
# 向服务器发送预编译请求 cursor.prepare("INSERT INTO my_table (field1, field2) VALUES (?, ?)") # 多次执行,仅发送参数 cursor.execute(None, ("mike", "rodent")) cursor.execute(None, ("john", "cat"))
- 使用
PreparedStatement类实现对象式操作:
from mariadb import PreparedStatement # 创建预编译语句对象 prep_stmt = PreparedStatement(cursor, "INSERT INTO my_table (field1, field2) VALUES (?, ?)") # 直接传入参数执行 prep_stmt.execute(("mike", "rodent")) prep_stmt.execute(("jane", "dog"))
注意事项
- 不同驱动的实现有差异:旧的
MySQLdb确实是客户端字符串替换;而mariadb官方驱动、mysql-connector-python(开启use_pure=True)都支持真正的服务器端原生预编译。 - 原生预编译语句会在服务器端缓存执行计划,多次复用能提升性能,同时避免SQL注入风险,比客户端字符串格式化更安全可靠。
内容的提问来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

