HeidiSQL显示PostgreSQL表占空间但无数据,批量插入异常求助
PostgreSQL批量插入后HeidiSQL查不到数据的排查方案
1. 确认事务提交状态
psycopg2默认开启事务,所有插入操作会在未提交的事务中执行——此时数据已写入磁盘(表大小增加),但其他连接(比如HeidiSQL)无法看到。单表插入可能因连接自动关闭触发隐式提交,多表插入时若未显式提交则会出现此问题。
- 解决:所有插入完成后,必须调用
conn.commit();使用上下文管理器时,确保外层连接正确提交,或在上下文内处理提交逻辑。
2. 排查未提交/回滚的事务
- 执行
SELECT * FROM pg_stat_activity查看是否存在idle in transaction状态的进程,这类未提交的事务会占用空间但数据对其他连接不可见。 - 检查代码中是否存在未捕获的异常,导致事务被自动回滚;若有异常处理逻辑,需确认是否错误触发了
conn.rollback()。
3. 修正HeidiSQL的查询状态
HeidiSQL若开启了未提交的事务,会基于事务快照查询数据,无法看到其他连接提交的内容:
- 执行
COMMIT关闭当前事务,或重启查询窗口; - 执行
SELECT count(*) FROM 目标表直接统计行数,避免UI缓存影响。
4. 验证批量插入的执行逻辑
- 在插入后打印
cur.rowcount,确认实际插入的行数是否符合预期; - 开启psycopg2的调试日志,检查生成的SQL语句是否正确,是否存在参数错误或条件过滤导致数据未插入。
5. 确认数据的实际存在性
在psycopg2的连接中直接执行SELECT count(*) FROM 目标表,若返回非零值,说明数据已存在,问题出在HeidiSQL的连接/缓存;若返回零,说明插入逻辑存在问题,需进一步排查代码。
内容的提问来源于stack exchange,提问作者Michael Halim
相关产品推荐
相关产品推荐

