Polars.read_database()指定schema_overrides包含Enum类型时读取失败的问题求助
Polars.read_database()指定schema_overrides包含Enum类型时读取失败的问题求助
大家好,我遇到了一个Polars读取数据库时的问题,想请教一下各位:
我用CockroachDB(兼容PostgreSQL)建了一个带Python原生Enum类型列的表,用Polars的pl.read_database()方法读取数据。当让Polars自动推断schema时(也就是不指定schema_overrides),读取是成功的,但因为生产环境下表可能为空,必须手动指定schema,这时候调用就报错了。
下面是我的最小复现代码:
# 导入依赖 import enum import polars as pl from sqlalchemy import Enum, Column from sqlmodel import SQLModel, create_engine, insert, select, Field
# 定义Python原生Enum class CompassEnum(enum.Enum): NORTH = 'N' EAST = 'E' SOUTH = 'S' WEST = 'W' # 定义SQLModel表模型 class Compass(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) compass_direction: CompassEnum = Field( sa_column=Column( Enum(CompassEnum), default=None, nullable=False, index=False ) )
# 初始化数据库连接(替换为实际连接串) ENGINE = create_engine('my_connection', echo=True) SQLModel.metadata.create_all(ENGINE) # 插入一条测试数据 statement = insert(Compass).values(compass_direction='NORTH') conn = ENGINE.connect() conn.execute(statement) conn.commit() conn.close()
# 构建查询语句 query = select(Compass.id, Compass.compass_direction) # 定义要覆盖的schema schema = {'id': pl.String, 'compass_direction': pl.Enum(CompassEnum)} # 这个能正常运行:依赖自动推断schema df_one = pl.read_database(query, ENGINE, infer_schema_length=1000) print(df_one) # 这个会报错:指定schema_overrides df_two = pl.read_database(query, ENGINE, schema_overrides=schema) print(df_two)
报错信息如下:
ComputeError: could not append value: CompassEnum.NORTH of type: object to the builder; make sure that all rows have the same schema or consider increasing infer_schema_length
注意看,当让Polars自动推断schema时读取成功,但指定schema_overrides后就抛出了上面的错误。我必须指定schema,因为生产环境中这个表可能是空的,自动推断会失效。
我的环境版本:
- polars==1.25.2
- Python 3.11.4
- 数据库:CockroachDB(兼容PostgreSQL)
有没有办法让Polars在指定schema_overrides包含Enum类型时正常读取数据呢?或者有没有其他靠谱的方案能处理空表时的schema指定问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

