Python psycopg2 как получить данные и передать в json

На примере ниже разберем как получить данные из БД, отсортировать по дате и вернуть в json формате.

Пример кода

import json
import psycopg2
from psycopg2 import sql
from psycopg2.extras import NamedTupleCursor

from datetime import datetime

class PostgreSQL:

def get_all_data(self):
    """ Returning key-value pair """
    with self.connect.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cursor:
        self.connect.autocommit = True

        query = 'SELECT * FROM stocks ORDER BY date DESC'
        cursor.execute(query)

        fetch = cursor.fetchall()

        # Create new List and Dicts inside it
        dic = {}
        stocks = []
        for stock in fetch:
            dic['currency'] = stock['currency'],
            dic['price'] = stock['price'],
            dic['quantity'] = stock['quantity'],
            dic['date'] = stock['date'].strftime("%Y-%m-%d %H:%M:%S")
            stocks.append(dic.copy())

        # Sort by date where last row would be last date (just in case)
        stocks = sorted(
            stocks,
            key=lambda x: datetime.strptime(x['date'], '%Y-%m-%d %H:%M:%S'), reverse=False
        )

        return json.dumps(stocks, separators=(',', ':'))

Разбор кода

connect.cursor

Нам нужно получить объект в виде словаря для его дальнейшей обработки:

with self.connect.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cursor:

Так мы получим данные в таком формате:

[RealDictRow([(‘name’, ‘Macerich’), (‘price’, 11.3), (‘quantity’, 200), (‘date’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)))]),
RealDictRow([(‘name’, ‘Macerich’), (‘price’, 11.3), (‘quantity’, 200), (‘date’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)))])]

Если обработка не нужна, можно забрать данные в виде кортежа (но что-то изменить внутри потом будет нельзя):

with self.connect.cursor(cursor_factory=NamedTupleCursor) as cursor:

В этом случае будет:

[Record([(‘name’, ‘Macerich’), (‘price’, 11.3), (‘quantity’, 200), (‘date’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)))]),
Record([(‘name’, ‘Macerich’), (‘price’, 11.3), (‘quantity’, 200), (‘date’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)))])]

Если ключи не нужны можно без содержимого в скобках:

with self.connect.cursor() as cursor:

Получим:

[(148, ‘Macerich’, 11.3, 200, 2260.0, -0.57, ‘Sell’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None))),…

Преобразование даты

Здесь мы преобразовываем дату:

dic['date'] = stock['date'].strftime("%Y-%m-%d %H:%M:%S")

из такого:

(‘date’, datetime.datetime(2020, 6, 5, 23, 0, 29, tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=0, name=None)))

в такое:

‘date’: ‘2020-06-01 10:17:40’

Как добавить в лист внутрь цикла словарь

Для этого мы используем метод copy():

stocks.append(dic.copy())

Сортировка по дате

Также в коде используется сортировка по дате в многомерном списке.

Привет! Ты находишься на моём сайте. Я разработчик. Здесь я делюсь своими наработками и знаниями. Спрашивай в комментариях, если тебе что-то не понятно или пиши, если есть что добавить.

Если вам пригодилась информация, вы можете поблагодарить автора сайта символическим пожертвованием:

Добавить комментарий

Напишите свой комментарий, если вам есть что добавить/поправить/спросить по теме текущей статьи:
"Python psycopg2 как получить данные и передать в json"
Если вам нужно добавить участок кода ставьте его между тегами <code></code>