psycopg2池SimpleConnectionPool需要提交吗?

时间:2015-07-13 22:24:03

标签: python django postgresql psycopg2

我实现了这段代码来创建一个池连接:

def create_global_connection(minconn, maxconn, _pgconnstr):
    global g_connection
    g_connection = psycopg2.pool.SimpleConnectionPool(minconn, maxconn, _pgconnstr)
    # global_connection.autocommit = True

@contextmanager
def getcursor():
    global g_connection
    conn = g_connection.getconn()
    try:
        yield conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    finally:
        g_connection.putconn(conn)

我选择这样的选择:

with getcursor() as cur:
    cur.execute("SELECT * FROM %s;" % (table))

我的问题是,连接和执行是否需要提交(在create_global_connection中注释掉的行)?

1 个答案:

答案 0 :(得分:1)

以下是有关交易的psycopg2文档的链接:

http://initd.org/psycopg/docs/usage.html#transactions-control

引用文档:

  

当连接退出with块时,如果块没有引发异常,则提交事务。如果发生异常,则回滚事务。

     

当光标退出with块时,它会关闭,释放最终与之关联的任何资源。交易状态不受影响。

     

请注意,与文件对象或其他资源不同,退出连接的块不会关闭连接,只会关闭与之关联的事务:连接可以在多个with语句中使用,每个with块都有效地包装在单独的交易中

如上所述,您的代码将执行select,但光标将关闭,除非您在with块中使用它。 with构造仅适用于2.5或更高版本。