1

根据psycopg2 文档,我们应该设置autocommit为获取默认的 PostgreSQL 行为。根据某些人的说法,这甚至似乎是首选方法。我的问题是,如果这是在这些情况下最好的方法,我该如何明确地开始交易?使用cursor.execute("BEGIN")?

另一方面,psycopg2 提供的上下文管理器如何考虑到这一点?他们是否会在区块开始时自动启动事务并在成功时提交?

4

2 回答 2

1

就我个人而言,我从不使用autocommit并且几乎总是使用with语法。

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)

退出上下文管理器后,它将立即提交。

同样地,

with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL)
        raise Exception("I changed my mind")

将导致SQL语句安全回滚。

with在 Python 中,对于您确实希望严格控制对象生命周期的少数情况非常有用,例如当对象创建和销毁与事务行为相关联时。

于 2015-09-11T15:43:17.200 回答
0

psycopg2的事务模型有点像 JDBC。

要打开事务,请关闭自动提交并开始工作。不需要明确BEGIN的。

要提交,请使用conn.commit().

如果每个语句自然是单个事务,则自动提交很好。那么就不需要显式的事务管理了。

于 2015-09-08T00:23:32.607 回答