【问题标题】:psycopg2 pool SimpleConnectionPool needs commit?psycopg2 池 SimpleConnectionPool 需要提交吗?
【发布时间】:2015-07-13 22:24:02
【问题描述】:

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

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 中注释掉的行)?

【问题讨论】:

    标签: python django postgresql psycopg2


    【解决方案1】:

    这是 psycopg2 交易文档的链接:

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

    引用自文档:

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

    当游标退出 with 块时,它会关闭,释放最终与之关联的所有资源。事务的状态不受影响。

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

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

    【讨论】:

    • 感谢耶稣。对不起,我的英语,我是巴西人,我还在学习。
    • 不客气。乐意效劳。我的葡萄牙语更糟;-)
    • 自动提交不适用于使用上述代码的插入脚本。我是否需要在上面的“with...as”块中添加显式提交语句?
    • 根据文档,您不需要显式提交。检查您的版本是否兼容。此外,您可能会在插入之前关闭光标。如果这些都不能解决/解释问题,我建议发布一个新问题来引用这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多