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

Admin Python

На примере ниже разберем как получить данные из БД, отсортировать по дате и вернуть в 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"