根据psycopg2 documentation,我们应该设置autocommit
以获取默认的PostgreSQL行为。根据{{3}},这甚至似乎是首选方法。我的问题是,如果这是在这些情况下最好的方法,我该如何明确地启动交易?使用cursor.execute("BEGIN")
?
另一方面,psycopg2提供的上下文管理器如何考虑到这一点?他们是否在块的开头自动启动事务并成功提交?
答案 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中非常有用,因为在某些情况下,您确实需要严格控制对象的生命周期,例如,当对象创建和销毁与事务行为相关时。