You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库的实现方式

  1. 使用cursor.prepare()方法创建服务器端预编译语句,后续复用执行:
# 向服务器发送预编译请求
cursor.prepare("INSERT INTO my_table (field1, field2) VALUES (?, ?)")
# 多次执行,仅发送参数
cursor.execute(None, ("mike", "rodent"))
cursor.execute(None, ("john", "cat"))
  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:21:08