Найти в Дзене
Computer Pro

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

Что необходимо сделать: Подключитесь к СУБД через psql и создайте базу данных skillbox_db, которая должна быть доступна юзеру, указанному в env-переменных. С помощью метакоманд подключитесь к созданной базе данных и создайте таблицу test_psql_table. Во flask-приложении с помощью ORM SqlAlchemy настройте соединение со skillbox_db и опишите модели пользователя и кофе, который предпочитает пить наш пользователь: мы имеем вот такой qsl-скрипт по созданию таблиц coffee и users С помощью функции 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 и связь с кофе заполните рандомно.
Создайте роуты для выпол
Оглавление
Просто картинка моего выходного дня, отвлечение от 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

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

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