根据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()
.
如果每个语句自然是单个事务,则自动提交很好。那么就不需要显式的事务管理了。