Как получить значения с плавающей точкой из таблицы PostgreSQL только с плавающей запятой вместо десятичной в psycopg2? - PullRequest
0 голосов
/ 29 мая 2019

Я использую 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 вручную float(rows[0]['amount']).

1 Ответ

0 голосов
/ 31 мая 2019

Сводка - вы можете зарегистрировать пользовательскую функцию преобразования типов на основе 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 ..., но это, кажется, нарушает ваше требование избегать определенных приведений.

...