├── .gitignore ├── README.md ├── creation └── README.md ├── design └── README.md ├── dml-advanced └── README.md ├── dml └── README.md ├── introduction └── README.md └── orm ├── README.md ├── fixtures └── tests_data.json └── readme └── book_publishers_scheme.png /.gitignore: -------------------------------------------------------------------------------- 1 | .vs/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Домашние задания на курсе «Python. Базы данных» 2 | 3 | 1. [Введение в БД. Типы БД](introduction) 4 | 2. [Работа с PostgreSQL. Создание БД](creation) 5 | 3. [Проектирование БД. Связи. 3НФ](design) 6 | 4. [Select-запросы, выборки из одной таблицы](dml) 7 | 5. [Группировки, выборки из нескольких таблиц](dml-advanced) 8 | 6. [Python и БД. ORM](orm) 9 | -------------------------------------------------------------------------------- /creation/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Работа с PostgreSQL. Создание БД» 2 | 3 | Написать SQL-запросы для создания таблиц из схемы, реализованной в [предыдущем домашнем задании](../introduction). 4 | 5 | Результатом работы является файл, содержащий SQL-запросы. 6 | -------------------------------------------------------------------------------- /design/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Проектирование БД. Связи. 3НФ» 2 | 3 | ## Задание 4 | 5 | ### Обязательная часть 6 | 7 | Будем развивать схему для музыкального сервиса. 8 | 9 | Ранее было ограничение, что каждый исполнитель поет строго в одном жанре - пора убрать это ограничение. Исполнители могут петь в разных жанрах, как и одному жанру могут принадлежать несколько исполнителей. 10 | 11 | Аналогичное ограничение было и с альбомами у исполнителей (альбом мог выпустить только один исполнитель). Теперь альбом могут выпустить несколько исполнителей вместе. Как и исполнитель может принимать участие во множестве альбомов. 12 | 13 | С треками ничего не меняем, все так же трек принадлежит строго одному альбому. 14 | 15 | Но появилась новая сущность - сборник. Сборник имеет название и год выпуска. В него входят различные треки из разных альбомов. 16 | 17 | _Обратите внимание_: один и тот же трек может присутствовать в разных сборниках. 18 | 19 | Задание состоит из двух частей: 20 | 21 | 1. Спроектировать и нарисовать схему (как в [первой домашней работе](../introduction)). Прислать изображение со схемой. 22 | 2. Написать SQL-запросы, создающие спроектированную БД (как во [второй домашней работе](../creation)). Прислать ссылку на файл, содержащий SQL-запросы. 23 | 24 | _Примечание:_ можно прислать сначала схему, получить подтверждение, что схема верная и после этого браться за написание запросов. 25 | 26 | ### Дополнительное (необязательное) задание 27 | 28 | Спроектировать отношение (или схему из нескольких отношений) "Сотрудник". У каждого сотрудника есть следующие параметры: 29 | 30 | 1. Имя 31 | 2. Отдел 32 | 3. Начальник (ссылка на начальника) 33 | 34 | _Примечание:_ начальник - тоже сотрудник. Отдел можно хранить строкой, можно идентификатором (не принципиально). 35 | 36 | Необходимо написать SQL-запрос, создающий таблицу "Сотрудник", и прислать ссылку на файл с этим запросом. 37 | -------------------------------------------------------------------------------- /dml-advanced/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Группировки, выборки из нескольких таблиц» 2 | 3 | Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. 4 | Внимание! Результаты запросов не должны быть пустыми (при необходимости добавьте данные в таблицы). 5 | 6 | 1. количество исполнителей в каждом жанре; 7 | 2. количество треков, вошедших в альбомы 2019-2020 годов; 8 | 3. средняя продолжительность треков по каждому альбому; 9 | 4. все исполнители, которые не выпустили альбомы в 2020 году; 10 | 5. названия сборников, в которых присутствует конкретный исполнитель (выберите сами); 11 | 6. название альбомов, в которых присутствуют исполнители более 1 жанра; 12 | 7. наименование треков, которые не входят в сборники; 13 | 8. исполнителя(-ей), написавшего самый короткий по продолжительности трек (теоретически таких треков может быть несколько); 14 | 9. название альбомов, содержащих наименьшее количество треков. 15 | 16 | Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). 17 | В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. 18 | -------------------------------------------------------------------------------- /dml/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Select-запросы, выборки из одной таблицы» 2 | 3 | ## Задание 1 4 | 5 | Заполните базу данных из предыдущего домашнего задания. В ней должно быть: 6 | 7 | * не менее 8 исполнителей; 8 | * не менее 5 жанров; 9 | * не менее 8 альбомов; 10 | * не менее 15 треков; 11 | * не менее 8 сборников. 12 | Внимание! Должны быть заполнены все поля каждой таблицы, в т.ч. таблицы связей (исполнителей с жанрами, исполнителей с альбомами, сборников с треками). 13 | 14 | ## Задание 2 15 | 16 | Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. 17 | Внимание! Результаты запросов не должны быть пустыми (учтите при заполнении таблиц). 18 | 19 | 1. название и год выхода альбомов, вышедших в 2018 году; 20 | 2. название и продолжительность самого длительного трека; 21 | 3. название треков, продолжительность которых не менее 3,5 минуты; 22 | 4. названия сборников, вышедших в период с 2018 по 2020 год включительно; 23 | 5. исполнители, чье имя состоит из 1 слова; 24 | 6. название треков, которые содержат слово "мой"/"my". 25 | 26 | Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). 27 | -------------------------------------------------------------------------------- /introduction/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Введение в БД. Типы БД» 2 | 3 | ## Задание 1 (практика) 4 | 5 | ### Обязательная часть 6 | 7 | Спроектировать схему (таблицы и связи между ними) для музыкального сайта. Требования: 8 | 9 | - На сайте должна быть возможность увидеть список исполнителей. 10 | - Для каждого исполнителя можно получить список его альбомов. 11 | - Для каждого альбома можно получить список треков, которые в него входят. 12 | - У исполнителя есть имя (псевдоним). 13 | - У альбома есть название и год выпуска. 14 | - У трека есть название и длительность. 15 | - Трек входит только в один альбом, как и альбом принадлежит только одному исполнителю (это искусственное ограничение, чтобы схема была проще, далее по курсу мы избавимся от этого ограничения). 16 | 17 | Результатом работы является изображение в формате PNG, содержащее схему БД. 18 | 19 | Для создания схем можно воспользоваться удобной платформой [draw.io](https://draw.io) или любым другм графическим редактором. 20 | 21 | [Краткая шпаргалка](https://docs.google.com/document/d/1KUagjHQQHIQYS2-qI0lgiV2wNxKdi00Q_Xw0nK7t3PA/edit?usp=sharing) по созданию схем БД на платформе [draw.io](https://draw.io). 22 | 23 | ### Дополнительное (необязательное) задание 24 | 25 | Добавить к схеме жанры. Требования: 26 | 27 | - На сайте должна быть возможность увидеть список жанров. 28 | - Для каждого жанра можно получить список исполнителей, которые поют в данном жанре. 29 | - У жанра есть название. 30 | - Исполнитель поет только в одном жанре (это искусственное ограничение, чтобы схема была проще, далее по курсу мы избавимся от этого ограничения). 31 | 32 | ## Задание 2 (подготовка к следующей лекции) 33 | 34 | Необходимо установить PostgreSQL на свой ПК. 35 | 36 | ### Windows 37 | 38 | [Видео-инструкция](https://embed.new.video/uyjUq9B3qYo6BbbkzG71Ny) 39 | 40 | [Ссылка на PostgreSQL для Windows](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) 41 | 42 | ### Linux (на примере Ubuntu 20.04) 43 | 44 | [Видео-инструкция](https://embed.new.video/cRQW4Z2YnxZUxzKRLWwnPF) 45 | 46 | Команды для установки: 47 | 48 | ```bash 49 | # PostgreSQL 50 | sudo apt update && sudo apt install postgresql-12 51 | 52 | # pgAdmin4 53 | wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 54 | echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |sudo tee /etc/apt/sources.list.d/pgdg.list 55 | sudo apt update && sudo apt install pgadmin4 56 | ``` 57 | 58 | ### Mac OS X 59 | 60 | [Видео-инструкция](https://kinescope.io/200639959) 61 | 62 | Команды для установки: 63 | 64 | ```bash 65 | brew install postgresql 66 | 67 | postgres -V 68 | 69 | pg_ctl -D /usr/local/var/postgres start 70 | 71 | createuser -P -s postgres 72 | ``` 73 | 74 | ## Задание 3 (подготовка к следующей лекции) 75 | 76 | На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. 77 | Это бесплатная программа, вы можете заранее скачать ее [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер. 78 | Обратите внимание, что данное задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже (или даже вообще использовать что-то другое). 79 | 80 | -------------------------------------------------------------------------------- /orm/README.md: -------------------------------------------------------------------------------- 1 | # Домашнее задание к лекции «Python и БД. ORM» 2 | 3 | ## Задание 1 4 | 5 | Составить модели классов SQLAlchemy по схеме: 6 | ![](readme/book_publishers_scheme.png) 7 | Интуитивно необходимо выбрать подходящие типы и связи полей. 8 | 9 | ## Задание 2 10 | 11 | Используя SQLAlchemy, составить запрос выборки магазинов, продающих целевого издателя. 12 | 13 | Напишите Python скрипт, который: 14 | 15 | - Подключается к БД любого типа на ваш выбор. 16 | - Импортирует необходимые модели данных. 17 | - Выводит издателя (publisher), имя или идентификатор которого принимается через `input`. 18 | 19 | 20 | ## Задание 3.1 (необязательное) 21 | 22 | - Настроить миграции через alembic. Миграция инициализации таблиц создается автоматически на основе модели данных. 23 | 24 | ## Задание 3.2 (необязательное) 25 | 26 | - Заполнение тестовых данных через миграцию или внешний скрипт. 27 | - Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON файле. 28 | 29 | Возможно несколько вариантов реализации: 30 | 31 | 1. Парсится json, создаются соотведствующие экземляры моделей и сохраняются в БД. 32 | 2. Создаются новые фикстуры взамен JSON на основе [SQLAlchemy-Fixtures](https://sqlalchemy-fixtures.readthedocs.io/en/latest/) или [FactoryBoy](https://github.com/FactoryBoy/factory_boy) 33 | 34 | ## Общие советы: 35 | 36 | - Параметры подключения к БД выносятся в отдельные переменные. 37 | - Загружать значения из окружения ОС, например через `os.getenv`. 38 | - Для самотестирования задания 2 рекомендуется выполнить задание 3.1, чтобы не создавать БД вручную или применить [create_all](https://docs.sqlalchemy.org/en/13/core/metadata.html#creating-and-dropping-database-tables). 39 | - Заполнять можно вручную или выполнить 3.2. 40 | -------------------------------------------------------------------------------- /orm/fixtures/tests_data.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"model": "publisher", "pk": 1, "fields": {"name": "O\u2019Reilly"}}, 3 | {"model": "publisher", "pk": 2, "fields": {"name": "Pearson"}}, 4 | {"model": "publisher", "pk": 3, "fields": {"name": "Microsoft Press"}}, 5 | {"model": "publisher", "pk": 4, "fields": {"name": "No starch press"}}, 6 | {"model": "book", "pk": 1, "fields": {"title": "Programming Python, 4th Edition", "publisher": 1}}, 7 | {"model": "book", "pk": 2, "fields": {"title": "Learning Python, 4th Edition", "publisher": 1}}, 8 | {"model": "book", "pk": 3, "fields": {"title": "Natural Language Processing with Python", "publisher": 1}}, 9 | {"model": "book", "pk": 4, "fields": {"title": "Hacking: The Art of Exploitation", "publisher": 4}}, 10 | {"model": "book", "pk": 5, "fields": {"title": "Modern Operating Systems", "publisher": 2}}, 11 | {"model": "book", "pk": 6, "fields": {"title": "Code Complete: Second Edition", "publisher": 3}}, 12 | {"model": "shop", "pk": 1, "fields": {"name": "Labirint"}}, 13 | {"model": "shop", "pk": 2, "fields": {"name": "OZON"}}, 14 | {"model": "shop", "pk": 3, "fields": {"name": "Amazon"}}, 15 | {"model": "stock", "pk": 1, "fields": {"shop": 1, "book": 1, "count": 34}}, 16 | {"model": "stock", "pk": 2, "fields": {"shop": 1, "book": 2, "count": 30}}, 17 | {"model": "stock", "pk": 3, "fields": {"shop": 1, "book": 3, "count": 0}}, 18 | {"model": "stock", "pk": 4, "fields": {"shop": 2, "book": 5, "count": 40}}, 19 | {"model": "stock", "pk": 5, "fields": {"shop": 2, "book": 6, "count": 50}}, 20 | {"model": "stock", "pk": 6, "fields": {"shop": 3, "book": 4, "count": 10}}, 21 | {"model": "stock", "pk": 7, "fields": {"shop": 3, "book": 6, "count": 10}}, 22 | {"model": "stock", "pk": 8, "fields": {"shop": 2, "book": 1, "count": 10}}, 23 | {"model": "stock", "pk": 9, "fields": {"shop": 3, "book": 1, "count": 10}}, 24 | {"model": "sale", "pk": 1, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:45:24.552Z", "count": 16, "stock": 1}}, 25 | {"model": "sale", "pk": 2, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:51:04.113Z", "count": 10, "stock": 3}}, 26 | {"model": "sale", "pk": 3, "fields": {"price": "10.50", "date_sale": "2018-10-25T09:52:22.194Z", "count": 9, "stock": 6}}, 27 | {"model": "sale", "pk": 4, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "stock": 5}}, 28 | {"model": "sale", "pk": 5, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "stock": 9}}, 29 | {"model": "sale", "pk": 6, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 1, "stock": 4}}, 30 | ] 31 | -------------------------------------------------------------------------------- /orm/readme/book_publishers_scheme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/netology-code/py-homeworks-db/7078bfdb0ed50e7dbca85ae9528cfc91e213b4e1/orm/readme/book_publishers_scheme.png --------------------------------------------------------------------------------