如何从PostgreSQL表中获取仅作为float而不是psycopg2中的Decimal的float值?

时间:2019-05-29 11:26:05

标签: python postgresql psycopg2

我正在使用psycopg2来查询PostgreSQL数据库。

import psycopg2
import psycopg2.extras

DB_CONNECTION = {
  'host': os.getenv('PG_HOST'),
  'database': os.getenv('PG_DB_NAME'),
  'user': os.getenv('PG_USER'),
  'password': os.getenv('PG_PASSWORD')
}

connection = psycopg2.connect(**DB_CONNECTION)
connection.autocommit = True
cursor = connection.cursor(cursor_factory = psycopg2.extras.RealDictCursor)

# amount column type is numeric in table
query = 'SELECT userid, amount FROM some_table WHERE userid = %(userid)s'
cursor.execute(query, {'userid': 1234})
rows = cursor.fetchall()
print(rows[0]['amount']) # This is value is object of decimal.Decimal

rows[0]['amount']decimal.Decimal类的对象。是否有任何简单明了的方法来将此值设为float?我不想手动float(rows[0]['amount'])将其转换为float。

1 个答案:

答案 0 :(得分:0)

摘要-您可以基于查询中返回的类型的OID注册自定义类型转换函数。 psycopg2文档给出了确切的示例:

DEC2FLOAT = psycopg2.extensions.new_type(
    psycopg2.extensions.DECIMAL.values,
    'DEC2FLOAT',
    lambda value, curs: float(value) if value is not None else None)
psycopg2.extensions.register_type(DEC2FLOAT)

请参阅-

您还可以强制转换SQL本身-select userid, amount::float from some_table ...,但这似乎违反了避免特定强制转换的要求。