Найти тему
Computer Pro

Работа с особенностями синхронного подключения к PostgreSQL

Оглавление
Просто картинка моего выходного дня, отвлечение от IT, фото моё
Просто картинка моего выходного дня, отвлечение от IT, фото моё

Что необходимо сделать:
Подключитесь к СУБД через psql и создайте базу данных skillbox_db, которая должна быть доступна юзеру, указанному в env-переменных.
С помощью метакоманд подключитесь к созданной базе данных и создайте таблицу test_psql_table.
Во flask-приложении с помощью ORM SqlAlchemy настройте соединение со skillbox_db и опишите модели пользователя и кофе, который предпочитает пить наш пользователь:
мы имеем вот такой qsl-скрипт по созданию таблиц coffee и users
-2
С помощью функции before_first_request создайте десять пользователей и десять сортов кофе.Для этого воспользуйтесь сервисом генерации тестового api-ответа Для заполнения атрибута address у пользователей — https://random-data-api.com/api/address/random_address.
Для кофе —
https://random-data-api.com/api/coffee/random_coffee. Обработайте ответ получения кофе, где title=blend_name, origin=origin, notes=notes, intensifier=intensifier.
Для пользователя поле name и связь с кофе заполните рандомно.
Создайте роуты для выполнения запросов (название не играет роли).Добавление пользователя. В ответе должна быть информация о новом пользователе с его предпочтением по кофе.
Поиск кофе по названию (используйте
полнотекстовый поиск, название — входной параметр).
Список уникальных элементов в заметках к кофе.
Список пользователей, проживающих в стране (страна — входной параметр).

Ну и соответственно я начал с самого начала, с запуска сервиса докер, после чего запуск контейнера skillbox-postges, вход в psql и создание базы данных skillbox_db:

  • systemctl start docker.service
  • docker run --name skillbox-postgres --rm -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e PGDATA=/var/lib/postgresql/data/pgdata -v /tmp:/var/lib/postgresql/data -p 5432:5432 -it postgres
  • docker exec -it skillbox-postgres /bin/sh
  • # psql -U postgres
P.S. При запуске контейнера skillbox-postgres способом, описанным выше есть небольшая проблема, после перезагрузки компа все базы, таблицы и юзеры пропадают, и на следующий день приходится всё восстанавливать. Мелочь, а неприятно!
И да, мне надоело каждый день запускать сервис докера, поэтому я не поленился и нашел решение, чтобы он в следующие разы запускался со стартом системы:
-3

Ну и инструкция, как развернуть постгрес докер контейнер на своем линух компе

После чего получаем консоль управления базами данных:

-4

Если абы чего написать в качестве пользователя БД и пароля, при создании движка (engine), и postgres всё примет - как бы не так, выскочит ошибка нужно создать пользователя test_db, ну и присвоить ему пароль, и чтобы данный пользователь имел право совершать действия с таблицами в БД. Я, на данный момент, не придумал ничего лучше как наделить пользователя правами суперпользователя.

-5

Хотя и понимаю, что суперпользователем он должен быть только для этой БД (может разберусь как сделать по другому). Если вы это знаете - напишите в комментах.

Тестовая база данных нужна для того чтобы правильно написать модель, потому как некоторые поля у меня вызывают вопросы, например что за поле типа VARCHAR[ ], что-то типа списка, а как его написать в sqlalchemy?

Искал совпадения (LIST, DICT, SET), оказалось ключевое слово ARRAY и вот какая получилась модель таблицы coffee:

-6

Осталось дело за малым - написать таблицу юзеров:

-7

!!! Эти модели не совсем верные, в последствии, это приведет к ошибке, при поиске пользователей из определенной страны!!! Смотри ниже, правильные модели!!!

Ну вот, задача выполнена, пока у меня написан код только на создание таблиц в базе данных, один единственный роут, перед выполнением которого, запускается очистка таблиц и создание их заново:

-8

Ну и собственно engine:

-9

Ну вот можно теперь подумать о создании массива из 10 пользователей и 10 сортах кофе, которые нужно загрузить в базу данных, согласно заданию выше.

SkillBox предоставил нам две ссылки для получения данных по адресам для наших пользователей и для данных по сортам кофе. Но эти ссылки предназначены для получения одного экземпляра данных (для одного пользователя и для одного сорта кофе) а нам нужно 10!!! Я было попытался создать цикл из десяти запросов, но на сайте установлена защита от DDOS атак, он просто не дает делать много запросов в короткие промежутки времени. Я было даже попытался создать свои собственные конструкции, но быстро понял что это все не то...

моя версия создания рандомных пользователей от которой я в последствии отказался...
моя версия создания рандомных пользователей от которой я в последствии отказался...
-11

Когда я уже настряпал своих JSONов, и сделал чтобы оно у меня все работало, до меня дошло - ведь наверняка можно как то получить сразу 10 пакетов данных для того и другого запроса а не "городить огород" и не изобретать велосипед. Скиллбокс мог бы и подсказать ответ на этот вопрос в описании к домашней работе. Надо просто было дописать в конце адреса "?size=10". Я перебрал много вариантов ключевого слова... В конечном итоге ссылки стали выглядеть так:

Ну а из своих "сочинений" в "RandomDataAPI" я использовал лишь получения имен пользователей, чот мне не захотелось фантазировать над их именами. Итак, получение данных:

-12
-13

Изначально, заполнение таблиц полученными данными, я организовал при помощи @app.before_request, но понял что эта штука мне не годится для работы над последующими пунктами домашнего задания, потому как перед каждым запросом обновляет данные в таблицах. Ты делаешь поиск по марке кофе или пользователя по стране а у тебя перед этим все марки кофе и страны сменились... Поэтому before_request отправил в комментарии до лучших времен.

-14

А вместо этого воспользовался главным эндпойнтом для создания и обновления таблиц:

-15

Ну вот таблицы созданы, можно заняться реализацией роутов:

Для отправки запросов к эдпойнтам я пользуюсь программой httpie (http) некое подобие curl и все скриншоты запросов будут показаны через использование этой программы. В Manjaro Linux (я пользуюсь этой системой) эта программа устанавливается обычным pacman:

sudo pacman -S httpie

Добавление пользователя. В ответе должна быть информация о новом пользователе с его предпочтением по кофе

-16
-17

Поиск кофе по названию (используйте полнотекстовый поиск, название — входной параметр)

-18

Тут перед запросом нужно посмотреть в БД какие марки кофе у нас имеются чтобы правильно составить запрос, а чтобы ответ был более полным, я изменю какую нибудь марку кофе чтобы слово поиска встречалось не в одной марке кофе а в, скажем, трёх местах и соответственно выдача результата была - три вида кофе:

-19
-20
-21

Как можно видеть, поиск выдал три марки кофе в котором встречается слово "Light"

Список уникальных элементов в заметках к кофе.

В этом пункте нам нужно пройтись по всем массивам в notes и собрать в список только уникальные элементы.

-22
-23
В экран терминала влезло не всё...
В экран терминала влезло не всё...

Список пользователей, проживающих в стране (страна — входной параметр)

Вот здесь у меня возникли трудности, потому как неверно задал модель адреса пользователя. Тут нужно было импортировать JSON из:

  • from sqlalchemy.dialects.postgresql import JSON

А я импортировал из чего-то другого (вот даже и не припомню уже из чего, а лезть в GIT и смотреть - лень)

Как и писал выше, вот полная рабочая модель:

как можно видеть, в базовом классе я объявил одно поле, оно будет наследоваться "потомками" в последующих полях и объявлять это поле там уже будет не нужно
как можно видеть, в базовом классе я объявил одно поле, оно будет наследоваться "потомками" в последующих полях и объявлять это поле там уже будет не нужно
-26

Ну и собственно сам запрос пользователей "по городу":

-27

Так как данные у нас динамичные и могут меняться, 'Germany' может не быть, поэтому я насильно напишу данную страну в базе данных, в поле адрес:

-28

Хотя, не исключаю что, возможно, и еще в каких то строках имеется страна - Германия... Одна точно теперь есть в базе данных!

-29
-30

Ну вот, вроде бы и готовы все пункты задания. Осталось только сделать задание с миграциями...

На том сказочке конец, а кто изучал - молодец!