psycopg2 更新查询破坏了我的 PostgreSQL table

psycopg2 Update Query broke up my PostgreSQL table

当我 运行 这个 UPDATE 查询时,它破坏了我的 PostgreSQL table messages。我不再能够更新行或 table,因此不得不创建一个新的 table 并删除旧的。

cursor.execute('''
        SELECT
            outbounds.messages.oubd_msg_pvt_uuid,
            outbounds.messages.oubd_ord_pvt_uuid,
            outbounds.messages.oubd_cont_pvt_uuid,
            outbounds.messages.oudb_sndr_pvt_uuid,
            outbounds.messages.end_phn_pvt_uuid,
            outbounds.messages.status          
        FROM outbounds.messages   
        WHERE outbounds.messages.status = false
    ''')
    records = cursor.fetchall()

    for row in records:
        print(row['sender'], ' -> ', row['number'], ' = ', row['content'])

        cursor.execute('UPDATE outbounds.messages SET status=true WHERE oubd_msg_pvt_uuid = %s', (row['oubd_msg_pvt_uuid'],))
        print(cursor.rowcount, "Record Updated successfully ")

虽然它说它已更新,但实际上该行并未更新。

我是 Python 的新手所以现在确定我做错了什么?

您好像忘记提交交易了。

如果您在关系数据库中启动一个事务,则在您结束该事务之前,所有数据修改都不会持久。

结束交易有两种方式:

  • COMMIT 使更改持久化

  • ROLLBACK 撤消事务中的所有更改,就好像它从未发生过一样

如果您在没有提交的情况下终止数据库会话,事务将自动回滚。

如果您的 UPDATE 挂起,则必须有一个并发打开的事务正在持有锁。在 pg_stat_activity 中找到它并使用 pid.

pg_terminate_backend 杀死它

如果重新启动没有处理锁,它可能是准备好的事务。签入 pg_prepared_xacts 并使用 ROLLBACK PREPARED 将其删除。

如果所有这些都不起作用,请查看 pg_stat_activity 并检查会话正在等待什么。