我想使用psycopg为我的postgres DB创建一个服务器端游标,这样我就可以读取一个非常大的表
cursor = conn.cursor('name_of_the_new_server_side_cursor')
cursor.execute(""" SELECT * FROM table LIMIT 10000000 """)
while True:
rows = cursor.fetchmany(5000)
if not rows:
break
for row in rows:
# do something with row
pass
当我遍历大表,提取数据时,在查询运行时,行可以更新或由其他进程/查询添加吗?如果是这样,当我的光标遍历表时,它会看到更新/新数据或数据,就像最初执行查询时一样吗?例如,当我拉出前50k行数据时,会对行51201进行更新。当我的光标向下移动以将数据从行50,000拉到55000时,我的查询将以更新的形式或原始形式返回行?如果另一个进程添加了一个新行,我的查询会在第一次运行cursor.execute语句时返回新行还是返回其状态表?
答案 0 :(得分:0)
The Documentation regarding autocommit says:
默认情况下,任何查询执行,包括一个简单的SELECT都将启动一个事务:对于长时间运行的程序,如果不采取进一步的操作,会话将保持“在事务中空闲”,这是一个不合适的条件,原因有几个(锁定会议持有,表格膨胀......)。
因此,选择将与每个其他事务具有相同的锁。
如果您只是想拉读数据,可以尝试通过设置来修复它:
conn.set_session(readonly=True, autocommit=True)
但是,如果您希望处理/更新数据,最好在数据库中的存储过程中执行此操作,具体取决于您要查找的内容。