我对此感到困惑。我所说的“准备好的语句”是指通过类似
传递的对象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 手册的本页上,我看到了 MariaDB 的 SQL 语言中存在的很多证据。
但是,无论我在哪里看到解释 MariaDB Python 模块的地方,都说这是“准备好的语句”所理解的那种语句:
cursor.execute( "SELECT * FROM sales WHERE sale_date >= ? and price > ?", (sale_date_val, price_val))
可以在here找到 2014 年的示例,其中上下文不是 MariaDB,而是 mysqldb。纽托弗在评论中表示,这不是一个真正准备好的声明,但亚历克斯·马泰利随后表示,它确实是,然后承认这可能不是。在最后的评论中,Olaf Dietsche 表示他已经检查了源代码,发现除了字符串格式化之外,没有任何内容涉及。
我想 MariaDB 的 Python 模块中的任何字符串格式化机制可能比正常情况更复杂一些,因为某些字符(例如空格)很难插入“?”中。在伪准备语句中。
但是,我只是想知道,在使用 Python 编码时,实际上是否有一种方法可以使用真正的准备好的语句,正如我所说,它显然存在于 MariaDB SQL 中......
准备好的语句可以是服务器端或客户端。 两者在代码中的使用方式相同,调用准备方法,然后设置绑定参数并执行。 在客户端中,客户端库插入绑定参数值,进行任何需要的引用,然后执行简单的语句。 在服务器端,插值由服务器完成。
我相信大多数客户端库都使用客户端准备好的语句; perl 库 或许还有其他一些库允许您选择。
通常您并不关心正在使用哪个。
PREPARE 语句是不同的东西,用于动态 sql,其中您的 sql 代码本身需要组装 sql 语句,而不是从客户端接收它