Python psycopg2使用:查询所有已打开游标及相关技术问题咨询
psycopg2 游标相关问题解答
问题1:是否有方法可以通过connection.cursor()查询所有已打开的游标?
- psycopg2的连接对象本身没有提供官方公开的API直接通过
connection.cursor()方法获取所有已打开的游标。 - 如果你需要追踪当前连接创建的所有游标,可以自行实现维护逻辑:声明一个存储列表,每次调用
connection.cursor()时把生成的游标对象存入列表,游标关闭后及时从列表中移除即可。
问题2:执行connection.cursor()后,生成的游标是否可以在pg_cursors视图中被查询到?
- 默认情况下查不到。psycopg2默认创建的是客户端侧游标,所有游标状态都在Python进程本地维护,不会上报到PostgreSQL服务端,自然不会出现在
pg_cursors视图里。 - 只有当你创建服务端游标(也叫命名游标)时才会出现在
pg_cursors里,创建方式是调用connection.cursor()时传入name参数,示例:cur = conn.cursor(name='my_server_side_cursor')。
问题3:由psycopg创建的游标对象,与postgres的pg_cursors中的游标是否为同一对象?
- 两者不是同一对象:
- 普通无名称的psycopg2游标完全是Python侧的封装对象,服务端根本感知不到它的存在,和
pg_cursors没有任何关联。 - 即使是命名的服务端游标,psycopg2的游标对象也只是对PostgreSQL服务端游标(也就是
pg_cursors里记录的条目)的代理封装对象,本身是Python层的实例,和服务端的游标实体属于不同层面的实现,仅存在对应映射关系。
- 普通无名称的psycopg2游标完全是Python侧的封装对象,服务端根本感知不到它的存在,和
内容的提问来源于stack exchange,提问作者Daniel Georgiev
相关产品推荐
相关产品推荐

