На примере ниже разберем как получить данные из БД, отсортировать по дате и вернуть в 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=(',', ':'))
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)))])]
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)))])]
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())
Сортировка по дате
Также в коде используется сортировка по дате в многомерном списке.