我想用插入和更新来修改一些数据。从心理教程看,我需要
cur = connection.cursor()
cur.execute(my_insert_statement)
connection.commit()游标类似乎与波斯特格斯定义的游标没有什么关系。
如果我模块化我的脚本,在主模块中创建一个连接和一些辅助函数(没有线程,只是为了模块化),我应该
mycursor.connection.commit()来执行
def process_log_file(自定义,游标):发布于 2014-04-30 13:59:55
这三种方法中的任何一种都会奏效(这主要是个人品味的问题),但我更喜欢(1)。原因如下:
cursor类型是轻量级的,仅仅创建它除了创建一个新的Python对象之外,没有什么特别之处。欢迎您创建、使用(提交/回滚)并销毁任意数量的游标,特别是如果这有助于您保持代码的整洁和组织。
此外,当您使用需要访问来自多个不同查询的数据的复杂逻辑时,cursor是很重要的:在这种情况下,游标充当数据的保留/迭代器。
最后,传递connection (您的实际句柄到后端),并将游标保持在特定函数/方法的本地,这只是“感觉正确”。
发布于 2014-05-01 00:16:29
cursor支持with使用模式,一旦块完成,它将自动关闭它们。这可能是一个非常有用的模式,当您使用游标进行压缩操作时。
在其他时候,游标可能需要在整个函数中使用,或者可能需要使用多个游标,因此在这种情况下,with模式就不那么有意义了,最好在函数级范围内声明它。
另外,请记住named cursors的重要性,这是两个库游标和Postgres游标交织在一起的地方。只需在构造函数调用中给name属性一个值,就可以自动获得服务器端游标,然后像任何Python集合一样对其进行迭代,并执行块取。
块大小可以更改,但默认情况下它以块2000为单位获取。在查询大型表时,这一点尤为重要,因为您可以使用庞大的结果集快速耗尽内存客户端。内核抽象必须直接处理Postgres游标,并在需要时在游标的迭代过程中透明地获取下一个块。
请记住,命名游标实际上只能用于一件事--一个查询,然后迭代;如果您试图在同一个游标上执行另一个查询,如果内存正常,它会抛出一个异常。对于未命名的游标,一旦处理完结果,您就可以在执行过程中重用相同的游标。
我通常将命名游标用于我认为甚至有可能返回相当大的结果集的任何查询,而对于小型查询和其他命令(如更新、删除、创建表等),使用非命名游标。
发布于 2014-04-30 13:57:58
Python规范说:
“数据库游标…用于管理获取操作的上下文。”
因此,从模块化的角度来看,除非您的函数需要以前操作的结果,否则创建新的游标并关闭它们,或者在它们离开作用域时让它们自行关闭,将更有意义。如果您有一个多次重复的操作,并且确信重新创建游标会带来开销,则始终可以创建一个包装游标的助手类,而不是简单的助手函数。
但是,您的三种方法都应该可以正常工作。我个人使用style #2编写了代码,但我同意这似乎是最糟糕的代码。
https://stackoverflow.com/questions/23389116
复制相似问题