psycopg2操作Postgres:fetchall正常但execute执行DROP表不生效
核心原因
psycopg2 默认关闭自动提交机制,连接建立后会开启一个隐式事务:
- 你执行的
SELECT属于读操作,不需要事务提交就能正常返回结果,所以看起来运行正常 DROP TABLE属于数据库结构变更的DDL语句,执行后必须手动提交事务,改动才会持久化到数据库;如果没有主动提交,连接断开时整个事务会自动回滚,删表操作自然不会生效。
修复方案
两种方案二选一即可:
- 执行完删表逻辑后手动提交事务
# 原有查询逻辑不变 cur.execute("DROP TABLE IF EXISTS test.ws_sites") # 新增事务提交逻辑,这是删表生效的关键 conn.commit() # 操作完成后记得关闭游标和连接 cur.close() conn.close()
- 初始化连接后直接开启自动提交,后续所有写操作、DDL操作无需手动提交就会生效
conn = psycopg2.connect( host="test.postgres.database.azure.com", database="postgres", user="test", password="test" ) # 开启自动提交 conn.autocommit = True cur = conn.cursor()
补充排查点:如果加了提交后还是删表失败,优先检查连接使用的账号是否有对应schema下的删表权限、目标表是否被其他活跃会话加了锁阻塞操作。
内容的提问来源于stack exchange,提问作者S.Perera
相关产品推荐
相关产品推荐

