You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:43:30