使用pyignite操作DATE列时遇Unknown type code错误求助
解决pyignite查询DATE类型列时的ParseError错误
问题核心:pyignite默认未识别Ignite SQL返回DATE类型对应的b'\xfe'类型码,而DATE类型预期映射为type code x0b的DateObject,导致查询时抛出pyignite.exceptions.ParseError: Unknown type code: b'\xfe',但INT和TIMESTAMP列可正常工作。
解决步骤
- 插入数据时匹配类型:Ignite的DATE类型对应Python的
datetime.date,而非datetime.datetime,插入时改用date类型避免潜在的类型映射问题。 - 注册自定义类型解析器:给pyignite客户端添加针对
b'\xfe'类型码的解析逻辑,将其转换为Python可识别的日期对象。
修改后的可运行代码
from pyignite import Client from pyignite.datatypes import DateObject import datetime def parse_fe_date(client, payload): # Ignite的DATE类型以1970-01-01为基准存储天数,与DateObject的存储逻辑一致 days = int.from_bytes(payload, byteorder='big', signed=True) return DateObject(days).value client = Client() # 注册自定义解析器处理0xfe类型码 client.type_resolvers[b'\xfe'] = parse_fe_date with client.connect("localhost", 10800): client.sql("DROP TABLE DATETEST IF EXISTS") client.sql('''CREATE TABLE DATETEST ( ID INT PRIMARY KEY, Date DATE, Timestamp TIMESTAMP )''') insert = '''INSERT INTO DATETEST ( ID, Date, Timestamp ) VALUES (?, ?, ?)''' client.sql(insert, query_args=[ 1, datetime.date.fromisoformat("2022-01-02"), # 使用date类型匹配DATE列 datetime.datetime.fromisoformat("2022-01-02") ]) with client.sql('SELECT * FROM DATETEST') as cursor: for row in cursor: print(row)
代码说明
parse_fe_date函数将b'\xfe'类型的二进制数据解析为天数,再通过DateObject转换为Python的date对象,与Ignite的DATE存储逻辑对齐。- 注册解析器到客户端的
type_resolvers字典后,pyignite遇到b'\xfe'类型码时会自动调用该函数解析。 - 插入DATE列时使用
datetime.date,确保与Ignite表定义的类型严格匹配。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

