预备语句
Psycopg 使用自动系统来管理预备语句。准备查询时,其解析和规划存储在服务端会话中,以便优化在同一连接(即使使用不同的参数)上后续执行的同一查询。
查询在连接上执行超过 prepare_threshold
次后会自动预备。psycopg
将确保规划的语句数不超过prepared_max
:如果执行进一步的查询,则释放最近最少使用的查询并释放关联的资源。
可以通过多种方式控制语句预备:
- 您可以决定通过传递
prepare=True
给Connection.execute()
或Cursor.execute()
来立即进行预备查询。查询会进行预备处理(如果尚未进行预备),并按首次使用时预备好的方式执行。 - 相反,传递
prepare=False
给execute()
将避免预备查询,无论执行查询的次数如何。参数的默认值为None
,这意味着在满足上述条件时进行预备查询。 - 通过将连接的
prepare_threshold
属性设置为None
,可以禁用在连接上使用预备语句。
在 3.1 版本更改: 您也可以设置prepare_threshold
为 connect()
方法的关键字参数。
PostgreSQL 文档 PREPARE 部分包含了有关 PostgreSQL 中预备语句的大量详细信息。
但请注意,Psycopg 不使用 SQL 语句(如
PREPARE
和EXECUTE
),而是使用协议级命令(如公开的PQsendPrepare
、PQsendQueryPrepared
接口)。
使用外部连接池程序(如 PgBouncer)与预备语句不兼容,因为同一客户端连接可能会更改它所引用的服务端会话。如果使用此类中间件,则应通过将Connection.prepare_threshold
属性设置为None
来禁用预备语句。