在pyscopg2中处理事务的首选方法是什么?

时间:2015-09-07 22:37:22

标签: python postgresql psycopg2 python-db-api

根据psycopg2 documentation,我们应该设置autocommit以获取默认的PostgreSQL行为。根据{{​​3}},这甚至似乎是首选方法。我的问题是,如果这是在这些情况下最好的方法,我该如何明确地启动交易?使用cursor.execute("BEGIN")

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

2 个答案:

答案 0 :(得分:0)

psycopg2的事务模型有点像JDBC。

要打开一个事务,请将autocommit设置为off,然后开始工作。无需明确BEGIN

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

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

答案 1 :(得分:0)

就我个人而言,我从不使用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中非常有用,因为在某些情况下,您确实需要严格控制对象的生命周期,例如,当对象创建和销毁与事务行为相关时。