You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用psycopg2操作Heroku PostgreSQL未生效,如何修复?

问题修复:psycopg2操作Heroku PostgreSQL未持久化的解决方法

问题原因

psycopg2默认会自动开启事务,所有写操作(建表、插入数据)都在事务中执行。如果不显式提交事务,当连接关闭时,数据库会自动回滚所有未提交的操作。这就是为什么第一个脚本里能查到数据(同事务内操作可见),但第二次重新连接查询时,表和数据都不存在的原因。

修复方案

方案1:显式提交事务

在执行完所有写操作后,调用conn.commit()提交事务,将操作持久化到数据库:

import psycopg2, os

DATABASE_URL = os.getenv('DATABASE_URL')
conn = psycopg2.connect(DATABASE_URL, sslmode='require')
cur = conn.cursor()
    
cur.execute("CREATE TABLE chat (id int, chat_name TEXT);")
cur.execute("""
            INSERT INTO chat (id, chat_name) VALUES
                (1, 'name1'),
                (2, 'name2');
            """)
# 提交事务,确保操作被保存
conn.commit()

cur.execute("SELECT * FROM chat;")
print(cur.fetchall())
conn.close()

方案2:使用上下文管理器(推荐)

利用with语句自动管理连接和事务:代码块执行完成后自动提交事务,出现异常则自动回滚,无需手动调用commit()和close():

import psycopg2, os

DATABASE_URL = os.getenv('DATABASE_URL')
with psycopg2.connect(DATABASE_URL, sslmode='require') as conn:
    with conn.cursor() as cur:
        cur.execute("CREATE TABLE chat (id int, chat_name TEXT);")
        cur.execute("""
                    INSERT INTO chat (id, chat_name) VALUES
                        (1, 'name1'),
                        (2, 'name2');
                    """)
        cur.execute("SELECT * FROM chat;")
        print(cur.fetchall())
# with块结束后自动提交事务并关闭连接

注意事项

  • 只读查询不需要提交事务,但使用上述两种方式也不会产生问题
  • 连接Heroku PostgreSQL时必须保留sslmode='require'参数,否则会连接失败

内容的提问来源于stack exchange,提问作者wowonline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:20:13