Python psycopg中的'cursor'类有什么意义?

Python psycopg中的'cursor'类有什么意义?,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我想用插入和更新来修改一些数据。从psycopg教程来看,我需要 cur = connection.cursor() cur.execute(my_insert_statement) connection.commit() Psycopg似乎和游标没什么关系,正如所定义的 如果我将脚本模块化,那么应该在主模块和一些辅助函数(没有线程,只是为了模块化)中创建连接 将连接参数传递给函数,并每次重新创建游标。频繁创建新的游标对象是否会有很大的开销 def process_log_file(self,

我想用插入和更新来修改一些数据。从psycopg教程来看,我需要

cur = connection.cursor()
cur.execute(my_insert_statement)
connection.commit()
Psycopg似乎和游标没什么关系,正如所定义的

如果我将脚本模块化,那么应该在主模块和一些辅助函数(没有线程,只是为了模块化)中创建连接

  • 将连接参数传递给函数,并每次重新创建游标。频繁创建新的游标对象是否会有很大的开销

    def process_log_file(self, connection):
    
  • 传递连接和游标-使函数签名和实现变得不必要的复杂

    def process_log_file(self, connection, cursor):
    
  • 仅将游标作为参数传递,并使用
    mycursor.connection.commit()
    进行提交

    def process_log_file(self, cursor):
    
  • 报告说:

    “数据库游标…用于管理提取操作的上下文。”

    因此,从模块化的角度来看,除非您的函数需要上一个操作的结果,否则创建新的游标并关闭它们,或者在它们离开作用域时让它们自己关闭会更有意义。如果您有一个重复多次的操作,并且确信重新创建游标会带来开销,那么您可以创建一个封装游标的帮助器类,而不是简单的帮助器函数


    但是,这三种方法都应该可以很好地工作。我个人曾使用style#2编写代码,但我同意这似乎是其中最差的一种。这三种方法中的任何一种都可以(主要是个人喜好的问题),但我更喜欢(1)。原因如下:

    cursor
    类型很轻,仅仅创建它除了创建一个新的Python对象之外没有做任何特殊的事情。欢迎您创建、使用(提交/回滚)和销毁尽可能多的游标,特别是如果这有助于保持代码干净和有序的话

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


    最后,传递
    连接(您到后端的实际句柄)并将游标保持在特定函数/方法的本地只是“感觉正确”。

    游标支持
    使用模式,该模式将在块完成后自动关闭它们。当您使用游标执行压缩操作时,这是一种非常有用的模式

    在其他情况下,可能需要在整个函数中使用游标,或者可能需要使用多个游标,因此在这种情况下,带
    模式的意义不大,最好在函数级范围内声明

    还要记住
    命名游标的重要性,这是psycopg游标和Postgres游标交织在一起的地方。只需在构造函数调用中给
    name
    属性一个值,您就会自动得到一个服务器端游标,它可以像任何Python集合一样进行迭代,并执行分块抓取

    块大小可以更改,尽管默认情况下它以2000块为单位获取。在查询大型表时,这一点尤其重要,因为您可能会在客户端快速耗尽内存,并产生大量结果集。psycopg抽象必须直接处理Postgres游标,需要时,在游标迭代期间透明地获取下一个块

    请记住,命名游标实际上只能用于一件事——一个您随后迭代的查询;如果您试图在同一个游标上执行另一个查询,如果内存可用,它将抛出一个异常。对于非命名游标,在处理完结果后,可以在执行过程中重复使用相同的游标


    我通常使用命名游标处理我认为可能返回相当大的结果集的任何查询,使用非命名游标处理小查询和其他命令,如更新、删除、表创建等。

    使用Psycopg cursor类的方式与postgresql游标无关。但是还有其他的方法可以使用它们。您的模块是否跨越事务,或者您的事务是否跨越模块,或者始终存在完美的通信?