Heroku上PostgreSQL存入BIGINT数值自动四舍五入问题如何解决
PostgreSQL插入BIGINT字段出现四舍五入精度丢失的修复方案
问题根源
- 首先排除PostgreSQL侧问题:PostgreSQL的
BIGINT为8字节有符号整数,支持范围为-9223372036854775808~9223372036854775807,你需要存储的821731693488584529远低于上限,字段类型本身不会导致精度丢失。 - 核心问题出在Python侧的SQL写法:你使用f-string直接拼接数值到SQL语句中,Python双精度浮点数的有效精度仅为53位,超过该长度的整数会被自动四舍五入,最终写入了错误值。同时f-string拼接SQL还存在SQL注入风险,属于不规范的数据库操作方式。
修复方案
- 替换SQL拼接写法,改用Python PostgreSQL驱动(以常用的psycopg2为例)的参数化查询能力,将插入值作为单独参数传入
execute方法即可:
# 错误写法(f-string拼接数值) # cursor.execute(f"INSERT INTO users (item_id, field_1, field_2, field_3, field_4) VALUES (821731693488584529, 0, 0, 0, 'None')") # 正确写法(参数化查询) cursor.execute( "INSERT INTO users (item_id, field_1, field_2, field_3, field_4) VALUES (%s, %s, %s, %s, %s)", (821731693488584529, 0, 0, 0, 'None') )
- 校验item_id的来源类型:如果item_id是从JSON接口、CSV文件等渠道读取的,确保在Python中始终以
int类型存储,不要经过float类型转换。比如解析JSON时遇到大整数,需要手动将对应字段转为int,避免JSON默认解析为float导致提前丢失精度。 - 若后续需要存储超出BIGINT范围的ID,可以将
item_id字段类型改为TEXT,当前场景下无需调整表结构。
内容的提问来源于stack exchange,提问作者mooncdx
相关产品推荐
相关产品推荐

