使用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
相关产品推荐
相关产品推荐

