【问题标题】:Psycopg2 query returning Decimal('value'), float is expectedPsycopg2 查询返回 Decimal(\'value\'),预计为浮点数
【发布时间】:2022-12-19 21:08:40
【问题描述】:

我在 Stackoverflow 上看到了一个有相同问题的主题,但我有一个不同的问题。我的系统在本地将值返回为浮点数,但在 GitHub Actions 上返回的是十进制。可能是什么原因

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())

GitHub:

ITS FOR TEST: res=Decimal('1')
ITS FOR TEST: res=Decimal('13')

本地:

ITS FOR TEST: res=1.0 
ITS FOR TEST: res=13.0 

我想在 GitHub 上有浮动回报

【问题讨论】:

    标签: python postgresql proxy decimal psycopg2


    【解决方案1】:

    这是由于 PostgreSQL 版本不同造成的。从 PostgreSQL 版本 14 开始,PostgreSQL 为 EXTRACT 查询返回类型为 numeric 的值;之前它返回float8(或double precision)。

    来自release notes

    将 EXTRACT() 更改为返回类型 numeric 而不是 float8 (Peter Eisentraut)

    这避免了某些用法中的精度损失问题。旧的行为仍然可以通过使用旧的底层函数 date_part() 来获得。

    Psycopg2 represents float8 作为 Python float 但将 numeric 表示为 Decimal。如发行说明所述,如果您希望返回浮点类型,则可以使用 date_part 而不是 extract

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多