PostgreSQL Gem类型转换异常:Decimal/Float被转为Integer求助
问题:Ruby-PG中Decimal/Float值被自动转为Integer类型
实际情况
- Decimal/Float类型的值从PostgreSQL查询返回时,被自动转换为Integer类型
- 示例:列中存储的浮点数值
14.7被转换为整数14
期望结果
- 保留原始的Decimal/Float精确类型,不进行自动转换
已尝试方案
执行了如下SQL查询:
qry = " SELECT CAST (column_name AS FLOAT) FROM table_name " @postgres.single_result(qry)
解决方案
1. 配置正确的类型映射
ruby-pg提供了PG::BasicTypeMapForResults,它能正确映射PostgreSQL的数值类型到Ruby对应类型。建立连接时设置这个类型映射,就能避免类型被错误转换:
conn = PG.connect(dbname: 'your_database') # 设置结果集的类型映射 conn.type_map_for_results = PG::BasicTypeMapForResults.new(conn)
这个类型映射会自动识别PostgreSQL的float4(单精度浮点)、float8(双精度浮点)、numeric(Decimal)类型,并用对应的编码器解码,保留原始数值精度。
2. 直接查询原始列,避免多余CAST
如果你的原始列本身就是浮点/Decimal类型(比如numeric、float8),不需要用CAST AS FLOAT,直接查询列名即可:
qry = "SELECT column_name FROM table_name" result = @postgres.single_result(qry)
多余的CAST可能干扰驱动的类型识别逻辑,导致错误转换。
3. 手动处理结果(应急方案)
如果上述方法暂时无法生效,可以手动将查询结果转换为浮点数/Decimal:
# 转换为浮点数 float_value = @postgres.single_result(qry).to_f # 转换为Decimal(更精确) decimal_value = BigDecimal(@postgres.single_result(qry).to_s)
内容的提问来源于stack exchange,提问作者Harshwardhan Patil
相关产品推荐
相关产品推荐

