在 psycopg2 中使用多个游标对 PostgreSQL 查询有什么好处?

What is the advantage of using multiple cursors in psycopg2 for PostgreSQL queries?

在 psycopg2 中使用单个游标执行所有查询与使用多个游标有什么区别。

也就是说,我这样做:

import psycopg2 as pg2
con = psycopg2.connect(...)
cur = con.cursor()
cur.execute(...)
....
....
cur.execute(...)
...

之后每次我希望执行查询时,我都使用相同的游标 cur

或者每次我想查询我的数据库时我都可以这样做:

with cur as con.cursor():
    cur.execute(...)

在这种情况下,我的光标 cur 将在每次使用后被删除。

哪种方法更好?一个人比另一个人有优势吗?一个比另一个快吗?更一般地说,为什么一个连接需要多个游标?

两个选项具有可比性;您始终可以对两者进行基准测试以查看是否存在有意义的差异,但是 psycopg2 游标非常轻巧(它们不代表实际的服务器端,DECLAREd 游标,unless you pass a name argument),我不会预计任何一条路线都会出现大幅放缓。

psycopg2 有游标的原因有两个。第一个是能够在结果集大于内存并且不能一次从数据库中检索的情况下表示服务器端游标;在这种情况下,游标用作与服务器端游标交互的客户端接口。

第二个是psycopg2游标不是线程安全的;一个连接对象可以被任何线程自由使用,但是每个游标最多只能被一个线程使用。每个线程都有一个游标允许多线程应用程序从任何线程访问数据库,同时共享相同的连接。

有关详细信息,请参阅 server side cursors and thread and process safety 上的 psycopg2 使用文档。