据我所知,所有数据库/访问库都支持准备语句和绑定变量(例如PostgreSQL,ODBC,MySQL等)。 Python DB-API似乎意味着数据库库应该在内部使用绑定变量来实现,但我检查的两个数据库不是..?
MySQLdb在内部使用字符串inerpolation(来自cursor.execute(..)
的{{3}}):
query = query % tuple([db.literal(item) for item in args])
而_mysql.c
the implementation使用:
r = mysql_real_query(&(self->connection), query, len);
而不是mysql_stmt_*
函数。
在psycopg2
库中,所有执行路径似乎都以_psyco_curs_execute
结尾,调用_psyco_curs_merge_query_args
,它将“查询字符串及其参数”合并在一起。 (参见implementation)。
绑定参数应该更快更安全,那么为什么这些库会进行字符串格式化呢?由于大多数查询都是唯一的,查询/语句缓存几乎没有用,我是否应该大幅缩小它们的大小(以防止缓存维护开销)?
答案 0 :(得分:1)
Postgres中预处理语句开销的开销相对较小。这个缓存不是在进程之间共享的,它只是每个进程 - 因此实现非常简单。因此,这不应成为任何决定的论据。还有其他人:
现在,几乎所有接口都能确保安全的客户端预备语句 - 并且在几乎所有情况下都可能更好地选择。异常是非常重复的语句 - 通常是一些INSERT或UPDATE。
检查使用的方法很简单 - 您可以通过set log_mi_duration_statement = 0
在PostgreSQL端记录所有查询,您将在带有或不带有绑定参数(占位符)的postgresql.log查询中看到。