psycopg中`cursor`类有什么意义?

gee*_*ekQ 8 python postgresql psycopg2

我想用INSERT和UPDATE修改一些数据.从psycopg教程看起来我需要它

cur = connection.cursor()
cur.execute(my_insert_statement)
connection.commit()
Run Code Online (Sandbox Code Playgroud)

Psycopg的游标类似乎与postgres定义的游标几乎没有关系.

如果我模块化我的脚本,在主模块中创建一个连接和一些工作函数(没有线程,只是为了模块化)我应该

  1. 将连接参数传递给函数并每次都重新创建游标.经常创建新游标对象会有很大的开销吗?

    def process_log_file(self, connection):
    
    Run Code Online (Sandbox Code Playgroud)
  2. 传递连接和光标 - 使函数签名和实现不必要地复杂化

    def process_log_file(self, connection, cursor):
    
    Run Code Online (Sandbox Code Playgroud)
  3. 仅将游标作为参数传递并mycursor.connection.commit()用于提交

    def process_log_file(self, cursor):
    
    Run Code Online (Sandbox Code Playgroud)

fog*_*fog 6

三者中的任何一个都会起作用(主要是个人品味),但我更喜欢(1).原因如下:

cursor类型是重量轻,只是创造它不会创建一个新的Python对象做什么特别的分开.欢迎您创建,使用(提交/回滚)并销毁任意数量的游标,特别是如果这有助于您保持代码清洁和有条理.

此外,cursor当您处理需要访问来自多个不同查询的数据的复杂逻辑时,s非常重要:在这种情况下,游标充当数据的持有者/迭代器.

最后,绕过connection(你的真实句柄到后端)并将光标保持在特定功能/方法的本地只是"感觉正确".