使用psycopg2向QuestDB插入NaN浮点数时遭遇psycopg2.DatabaseError错误,求正确转换及插入方法
解决QuestDB插入NaN时psycopg2报错的问题
我之前也碰到过一模一样的问题,其实核心原因是psycopg2对NaN的默认序列化方式和QuestDB的期望不匹配,但QuestDB本身确实支持存储NaN浮点值,只要调整参数传递的方式就能解决,下面是具体的解决方案:
1. 确保传递的是Python原生float类型的NaN
首先检查你的values列表中的NaN值,必须是Python原生的float('nan'),而不是字符串'NaN'。如果是从其他库(比如numpy)获取的NaN,需要确保转换为Python float类型:
# 正确的value示例 import numpy as np # 方式1:用Python原生float构造NaN values = [(1.5, float('nan'), 3.2), (4.1, float('nan'), 6.7)] # 方式2:将numpy的NaN转换为Python float values = [(1.5, float(np.nan), 3.2), (4.1, float(np.nan), 6.7)]
2. 注册numpy类型适配器(如果使用numpy数据)
如果你大量使用numpy的数值类型(比如np.float64),可以注册一个适配器让psycopg2正确识别并序列化NaN:
import psycopg2.extensions import numpy as np # 注册numpy float64类型的适配器,确保NaN能被正确序列化 psycopg2.extensions.register_adapter(np.float64, lambda x: psycopg2.extensions.AsIs(float(x)))
注册之后,就可以直接传递np.nan到executemany中,无需手动转换。
3. 绝对不要手动拼接NaN到SQL语句里
注意不要尝试把'NaN'字符串直接拼到SQL中(比如用format替换占位符),这会直接触发你遇到的unsupported type 'NaN'::float错误。始终使用参数化查询(也就是你现在用的%s占位符+executemany的方式),让psycopg2和QuestDB自行处理类型转换。
快速验证方法
你可以用一个简单的测试语句验证是否生效:
cursor.execute("CREATE TABLE IF NOT EXISTS test_nan (val DOUBLE)") cursor.executemany("INSERT INTO test_nan VALUES (%s)", [(float('nan'),)]) conn.commit() # 查询验证NaN是否成功存储 cursor.execute("SELECT val FROM test_nan WHERE val IS NaN") print(cursor.fetchone()) # 正常情况下会返回 (nan,)
这样就能正确插入并查询NaN值了。
内容的提问来源于stack exchange,提问作者John Lee
相关产品推荐
相关产品推荐

