【问题标题】:What happens to an open cursor after rolling back the transaction in Postgres using Psycopg2?使用 Psycopg2 在 Postgres 中回滚事务后打开的游标会发生什么?
【发布时间】:2020-02-18 08:21:11
【问题描述】:

我正在尝试使用 Psycopg2's copy_expert()CSV 文件列表复制到 Postgres

我打开光标分别为每个文件执行复制命令,并在复制数据后关闭它。 但是,如果我在此过程中遇到任何文件错误,我将回滚事务。

如果出现错误,我不确定在复制 CSV 文件之前打开的光标会发生什么。

在连接完成回滚后会自动关闭还是保持原样?

我已经检查了 psycopg2 http://initd.org/psycopg/docs/connection.html#connection.rollback 上的回滚文档。但是,我仍然不确定尚未关闭的光标会发生什么,因为他们没有在文档中提到与光标相关的任何内容。

try:
    for tablename, filename in self.mapping:
        cur = self.conn.cursor()
        filename = f"{self.to_db}{wid}-{filename}"
        filename = f"{os.path.join(self.directory, filename)}.csv"
        sql = f"copy {tablename} from stdin with delimiter as ',' csv header;"
        with open(f"{filename}", 'r') as file:
            cur.copy_expert(sql, file)
        cur.close()
    self.conn.commit()
except Exception as e:
    self.conn.rollback()
    return e

【问题讨论】:

    标签: python database postgresql cursor psycopg2


    【解决方案1】:

    您可以使用游标的上下文管理器,当代码离开 `with´ 块时,游标会自动关闭。
    由于您是在 for 循环之后触发提交,因此无需在每次循环迭代时“重新创建”游标。

    class foo():
        def __init__(self):
            self.conn = psycopg2.connect('host=...')
    
        def whatever(self):
            with self.conn.cursor() as cur:
                try:
                    for tablename, filename in self.mapping:
                        filename = f"{self.to_db}{wid}-{filename}"
                        filename = f"{os.path.join(self.directory, filename)}.csv"
                        sql = f"copy {tablename} from stdin with delimiter as ',' csv header;"
                        with open(f"{filename}", 'r') as file:
                            cur.copy_expert(sql, file)
                    self.conn.commit()
                except Exception as e:
                    self.conn.rollback()
                    return e
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2014-11-09
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多