我正在使用Python中的Psycopg2访问PostgreSQL数据库.我很好奇,使用with closing()模式来创建和使用游标是否安全,或者是否应该使用围绕查询的显式try/except.我的问题是关于插入或更新,以及事务.

据我所知,所有Psycopg2查询都发生在一个事务中,这取决于调用代码来提交或回滚事务.如果with closing(...块内发生错误,是否发出回滚?在较旧版本的Psycopg2中,在close()上明确发布了回滚,但现在不再是这种情况(参见http://initd.org/psycopg/docs/connection.html#connection.close).

举个例子,我的问题可能更有意义.下面是一个使用with closing(...的例子

with closing(db.cursor()) as cursor:
     cursor.execute("""UPDATE users                    
             SET password = %s, salt = %s
             WHERE user_id = %s""",
             (pw_tuple[0], pw_tuple[1], user_id))
     module.rase_unexpected_error()
     cursor.commit()

当模块启动时会发生什么.raise_unexpected_error()引发错误?交易是否回滚?据我所知,我要么提交它们,要么回滚它们.那么在这种情况下,会发生什么?

或者,我可以这样写我的查询:

cursor = None
try:
    cursor = db.cursor()
    cursor.execute("""UPDATE users                    
            SET password = %s, salt = %s
            WHERE user_id = %s""",
            (pw_tuple[0], pw_tuple[1], user_id))
    module.rase_unexpected_error()
    cursor.commit()
except BaseException:
    if cursor is not None:
        cursor.rollback()
finally:
    if cursor is not None:
        cursor.close()

我还应该提到,我不知道Psycopg2的connection class cursor()方法是否会引发错误(文档中没有说明),所以安全性比抱歉要好,不是吗?

我应该使用哪种发出查询和管理事务的方法?

推荐答案

Your link to the Psycopg2 docs种解释本身,不是吗?

... 请注意,在不首先提交更改的情况下关闭连接将

在版本2.2中更改:之前,由发布了显式回滚

所以,除非您使用不同的隔离级别,或者使用PgBouncer,否则您的第一个示例应该可以正常工作.但是,如果希望对事务期间发生的事情进行更细粒度的控制,那么try/except方法可能是最好的,因为它与数据库事务状态本身并行.

Postgresql相关问答推荐

"错误:无法创建用户:错误:关系\users\违反了非空约束

转换失败:(—122.763091,49.04676)转换为地理(位置)""

如何高效地将行聚合到数组中,同时保留`NULL`来指示丢失的数据?

ANTLR4 PostgreSQL语法被 destruct 了吗?

无法在kubernetes中设置postgres复制

在Postgres游标中从一行变量中减go 另一行变量

使用doobie,如何将Scala case类映射到带有类型tstzmultirange的PostgreSQL列?

至少 pgRouting 的某些部分可以与并行查询并行运行吗?

表示 SQL 表的 Go struct

为什么我使用 VBA 只能从 postgres 获得 10 行?

使用间隔参数的 go postgres 准备好的语句不起作用

JPA findBy 字段忽略大小写

PostgreSQL - 改变数字的精度?

Nodejs应用程序的node-postgres vs pg-promise

PostgreSQL:如何安装 plpythonu 扩展

我应该同时指定 INDEX 和 UNIQUE INDEX 吗?

如何使用 WITH RECURSIVE 子句进行 Select

与 iexact 一起使用时,Django get_or_create 无法设置字段

如何减少存储(缩减)我的 RDS 实例?

使用python将数据从csv复制到postgresql