根据psycopg2 文档,我们应该设置autocommit为获取默认的 PostgreSQL 行为。根据某些人的说法,这甚至似乎是首选方法。我的问题是,如果这是在这些情况下最好的方法,我该如何明确地开始交易?使用cursor.execute("BEGIN")?
另一方面,psycopg2 提供的上下文管理器如何考虑到这一点?他们是否会在区块开始时自动启动事务并在成功时提交?
根据psycopg2 文档,我们应该设置autocommit为获取默认的 PostgreSQL 行为。根据某些人的说法,这甚至似乎是首选方法。我的问题是,如果这是在这些情况下最好的方法,我该如何明确地开始交易?使用cursor.execute("BEGIN")?
另一方面,psycopg2 提供的上下文管理器如何考虑到这一点?他们是否会在区块开始时自动启动事务并在成功时提交?
就我个人而言,我从不使用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 中,对于您确实希望严格控制对象生命周期的少数情况非常有用,例如当对象创建和销毁与事务行为相关联时。
psycopg2的事务模型有点像 JDBC。
要打开事务,请关闭自动提交并开始工作。不需要明确BEGIN的。
要提交,请使用conn.commit().
如果每个语句自然是单个事务,则自动提交很好。那么就不需要显式的事务管理了。