本地返回float但GitHub Actions返回Decimal的原因及float适配需求
解决EXTRACT查询在本地与GitHub Actions返回类型不一致的问题
问题概述
本地环境执行EXTRACT查询返回float类型值(如1.0、13.0),但在GitHub Actions中返回Decimal类型值(如Decimal('1')、Decimal('13')),需要统一为float类型。
相关代码与查询
业务代码
session = app.ReadOnlySession() query_ = text(query) result_proxy = session.execute(query_, fetched_options) res = result_proxy.fetchone()[0] session.close() if input_key in ["local_hour", "day_of_week"]: logger.info(f"ITS FOR TEST: {res=}")
查询语句
SELECT EXTRACT(dow FROM now()) SELECT EXTRACT(hour FROM now())
解决方案
方案1:显式转换结果为float
直接在代码中将查询结果转为float,彻底规避环境差异带来的类型不一致问题,这是最简洁可靠的方式:
res = float(result_proxy.fetchone()[0])
无论底层返回Decimal还是float,都会被统一转换为float类型。
方案2:调整数据库驱动的类型转换配置
如果希望从驱动层面解决,以PostgreSQL的psycopg2驱动为例,可在创建SQLAlchemy引擎时添加use_decimal=False参数,强制驱动将DECIMAL类型转为float返回:
from sqlalchemy import create_engine engine = create_engine( "postgresql://your_user:your_pass@your_host/your_db", connect_args={"use_decimal": False} )
该参数会让psycopg2直接返回float而非Decimal,从根源上统一类型。
方案3:统一依赖版本
检查本地与GitHub Actions环境中的依赖版本(如psycopg2/psycopg2-binary、SQLAlchemy),确保两者完全一致。将本地验证过的依赖版本写入requirements.txt或pyproject.toml,让GitHub Actions安装相同版本的依赖,避免版本差异导致的类型转换逻辑变化。
内容的提问来源于stack exchange,提问作者Dmytryi Bernada
相关产品推荐
相关产品推荐

