使用Polars读取SQLite数据库时遭遇列类型无效错误
Polars读取SQLite数据的类型兼容问题解决
问题根源
你碰到的报错核心是Polars依赖的connectorx与SQLite的动态类型系统不兼容。SQLite是弱类型数据库,列的声明类型不约束实际存储的数据类型,但connectorx会严格按照表定义的类型去做映射解析,这就导致了冲突:
- 当
unixtime列声明为timestamp时,connectorx无法正确识别该类型,误判为Integer类型抛出错误; - 改成
integer后,另一列的TEXT类型同样触发映射失败,说明connectorx对SQLite的部分基础类型支持存在缺陷。
解决办法
1. 显式转换查询列类型(最直接)
在SQL语句里手动转换列类型,强制适配Polars支持的类型:
# 如果unixtime是unix时间戳格式,转成整数 querystring = "SELECT CAST(列名0 AS TEXT), CAST(unixtime AS INTEGER) FROM table1" msgt1SAT = pl.read_database(querystring, conn)
要是unixtime是SQLite的timestamp字符串,先转成标准时间字符串再处理:
querystring = "SELECT 列名0, strftime('%Y-%m-%d %H:%M:%S', unixtime) AS unixtime FROM table1" msgt1SAT = pl.read_database(querystring, conn) # 后续转成Polars的datetime类型 msgt1SAT = msgt1SAT.with_columns(pl.col("unixtime").str.to_datetime())
2. 换用SQLAlchemy引擎读取
绕开connectorx的类型映射问题,用Polars结合SQLAlchemy读取:
from sqlalchemy import create_engine import polars as pl engine = create_engine(f'sqlite:///{pathToDB}') with engine.connect() as conn: msgt1SAT = pl.read_database(querystring, conn, engine="sqlalchemy")
SQLAlchemy对SQLite的类型解析更成熟,兼容性更好。
3. 升级依赖版本
connectorx和Polars一直在修复类型兼容问题,试试升级到最新版:
pip install --upgrade polars connectorx
关于功能发布的疑问
Polars的read_database依赖connectorx实现多数据库读取,而connectorx对SQLite的支持晚于MySQL、PostgreSQL等数据库。SQLite的动态类型特性让类型映射的适配难度更高,功能发布是因为它能覆盖大部分主流场景,但边缘情况的兼容需要逐步迭代。遇到这类问题可以用上面的方案规避,也可以去项目仓库提交issue反馈具体的类型冲突案例。
内容的提问来源于stack exchange,提问作者bjornasm
相关产品推荐
相关产品推荐

