From 89c9e7c34d093b47da130427cbf050ae8fac6d9f Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Sat, 30 Apr 2022 15:04:41 +0300 Subject: [PATCH 01/27] hw1 + hw2 --- {introduction => 01-introduction}/README.md | 32 +++++++-------------- {design => 02-creation}/README.md | 10 ++++--- README.md | 9 +++--- creation/README.md | 5 ---- 4 files changed, 21 insertions(+), 35 deletions(-) rename {introduction => 01-introduction}/README.md (68%) rename {design => 02-creation}/README.md (85%) delete mode 100644 creation/README.md diff --git a/introduction/README.md b/01-introduction/README.md similarity index 68% rename from introduction/README.md rename to 01-introduction/README.md index 5fd21a9..91ae088 100644 --- a/introduction/README.md +++ b/01-introduction/README.md @@ -2,32 +2,22 @@ ## Задание 1 (практика) -### Обязательная часть - Спроектировать схему (таблицы и связи между ними) для музыкального сайта. Требования: -- На сайте должна быть возможность увидеть список исполнителей. +- На сайте должна быть возможность увидеть список музыкальных жанров. +- Для каждого жанра можно получить список исполнителей, которые исполняют в соответствующем жанре. - Для каждого исполнителя можно получить список его альбомов. - Для каждого альбома можно получить список треков, которые в него входят. -- У исполнителя есть имя (псевдоним). -- У альбома есть название и год выпуска. -- У трека есть название и длительность. -- Трек входит только в один альбом, как и альбом принадлежит только одному исполнителю (это искусственное ограничение, чтобы схема была проще, далее по курсу мы избавимся от этого ограничения). +- У жанра есть название. +- У исполнителя есть имя (псевдоним) и жанр, в котором он исполняет. +- У альбома есть название, год выпуска и его исполнитель. +- У трека есть название, длительность и альбом, которому этот трек принадлежит. Результатом работы является изображение в формате PNG, содержащее схему БД. -Для создания схем можно воспользоваться удобной платформой [draw.io](https://draw.io) или любым другм графическим редактором. - -[Краткая шпаргалка](https://docs.google.com/document/d/1KUagjHQQHIQYS2-qI0lgiV2wNxKdi00Q_Xw0nK7t3PA/edit?usp=sharing) по созданию схем БД на платформе [draw.io](https://draw.io). - -### Дополнительное (необязательное) задание +Для создания схем можно воспользоваться удобной платформой [app.diagrams.net](https://app.diagrams.net/) или любым другим графическим редактором. -Добавить к схеме жанры. Требования: - -- На сайте должна быть возможность увидеть список жанров. -- Для каждого жанра можно получить список исполнителей, которые поют в данном жанре. -- У жанра есть название. -- Исполнитель поет только в одном жанре (это искусственное ограничение, чтобы схема была проще, далее по курсу мы избавимся от этого ограничения). +[Краткая шпаргалка](https://docs.google.com/document/d/1KUagjHQQHIQYS2-qI0lgiV2wNxKdi00Q_Xw0nK7t3PA/edit?usp=sharing) по созданию схем БД на платформе [app.diagrams.net](https://app.diagrams.net/). ## Задание 2 (подготовка к следующей лекции) @@ -71,8 +61,8 @@ pg_ctl -D /usr/local/var/postgres start createuser -P -s postgres ``` -## Задание 3 (подготовка к следующей лекции) +## Задание 3 (подготовка к следующей лекции) -На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. Это бесплатная программа, вы можете заранее скачать ее [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер. -Обратите внимание, что данное задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже (или даже вообще использовать что-то другое). +На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. Это бесплатная программа, вы можете заранее скачать ее [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер. +Обратите внимание, что данное задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже (или даже вообще использовать что-то другое). diff --git a/design/README.md b/02-creation/README.md similarity index 85% rename from design/README.md rename to 02-creation/README.md index d6a3a4a..ac3e064 100644 --- a/design/README.md +++ b/02-creation/README.md @@ -1,6 +1,6 @@ -# Домашнее задание к лекции «Проектирование БД. Связи. 3НФ» +# Домашнее задание к лекции «Работа с SQL. Создание БД» -## Задание +## Задание ### Обязательная часть @@ -18,11 +18,13 @@ _Обратите внимание_: один и тот же трек может Задание состоит из двух частей: -1. Спроектировать и нарисовать схему (как в [первой домашней работе](../introduction)). Прислать изображение со схемой. -2. Написать SQL-запросы, создающие спроектированную БД (как во [второй домашней работе](../creation)). Прислать ссылку на файл, содержащий SQL-запросы. +1. Спроектировать и нарисовать схему (как в [первой домашней работе](../01-introduction)). Прислать изображение со схемой. +2. Написать SQL-запросы, создающие спроектированную БД. Прислать ссылку на файл, содержащий SQL-запросы. _Примечание:_ можно прислать сначала схему, получить подтверждение, что схема верная и после этого браться за написание запросов. +--- + ### Дополнительное (необязательное) задание Спроектировать отношение (или схему из нескольких отношений) "Сотрудник". У каждого сотрудника есть следующие параметры: diff --git a/README.md b/README.md index 879b2fd..543a057 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Домашние задания на курсе «Python. Базы данных» -1. [Введение в БД. Типы БД](introduction) -2. [Работа с PostgreSQL. Создание БД](creation) -3. [Проектирование БД. Связи. 3НФ](design) -4. [Select-запросы, выборки из одной таблицы](dml) -5. [Группировки, выборки из нескольких таблиц](dml-advanced) +1. [Введение в БД. Типы БД](./01-introduction) +1. [Работа с SQL. Создание БД](./02-creation) +1. [Select-запросы, выборки из одной таблицы](dml) +1. [Группировки, выборки из нескольких таблиц](dml-advanced) diff --git a/creation/README.md b/creation/README.md deleted file mode 100644 index d6408c6..0000000 --- a/creation/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Домашнее задание к лекции «Работа с PostgreSQL. Создание БД» - -Написать SQL-запросы для создания таблиц из схемы, реализованной в [предыдущем домашнем задании](../introduction). - -Результатом работы является файл, содержащий SQL-запросы. From 40cebc48081976b41ab76b1c626bd20bcf0a3b5d Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Sat, 30 Apr 2022 15:15:54 +0300 Subject: [PATCH 02/27] hw3 + hw4 --- {dml => 03-dml}/README.md | 24 ++++++++++++------ {dml-advanced => 04-dml-advanced}/README.md | 17 ++++++++++--- {orm => 06-orm}/README.md | 0 {orm => 06-orm}/fixtures/tests_data.json | 0 .../readme/book_publishers_scheme.png | Bin README.md | 6 +++-- 6 files changed, 34 insertions(+), 13 deletions(-) rename {dml => 03-dml}/README.md (72%) rename {dml-advanced => 04-dml-advanced}/README.md (72%) rename {orm => 06-orm}/README.md (100%) rename {orm => 06-orm}/fixtures/tests_data.json (100%) rename {orm => 06-orm}/readme/book_publishers_scheme.png (100%) diff --git a/dml/README.md b/03-dml/README.md similarity index 72% rename from dml/README.md rename to 03-dml/README.md index 58dfe6f..86e016b 100644 --- a/dml/README.md +++ b/03-dml/README.md @@ -4,16 +4,18 @@ Заполните базу данных из предыдущего домашнего задания. В ней должно быть: -* не менее 8 исполнителей; -* не менее 5 жанров; -* не менее 8 альбомов; -* не менее 15 треков; -* не менее 8 сборников. +- не менее 8 исполнителей; +- не менее 5 жанров; +- не менее 8 альбомов; +- не менее 15 треков; +- не менее 8 сборников. + Внимание! Должны быть заполнены все поля каждой таблицы, в т.ч. таблицы связей (исполнителей с жанрами, исполнителей с альбомами, сборников с треками). ## Задание 2 -Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. +Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. + Внимание! Результаты запросов не должны быть пустыми (учтите при заполнении таблиц). 1. название и год выхода альбомов, вышедших в 2018 году; @@ -21,6 +23,12 @@ 3. название треков, продолжительность которых не менее 3,5 минуты; 4. названия сборников, вышедших в период с 2018 по 2020 год включительно; 5. исполнители, чье имя состоит из 1 слова; -6. название треков, которые содержат слово "мой"/"my". +6. название треков, которые содержат слово "мой"/"my". + +--- + +Результатом работы будет 3 файла в формате `.sql`: -Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). +- с INSERT запросами (задание 1) +- с SELECT запросами (задание 2) +- с CREATE запросами (из предыдущей домашней работы) diff --git a/dml-advanced/README.md b/04-dml-advanced/README.md similarity index 72% rename from dml-advanced/README.md rename to 04-dml-advanced/README.md index 01b91e2..1125b4b 100644 --- a/dml-advanced/README.md +++ b/04-dml-advanced/README.md @@ -1,6 +1,7 @@ -# Домашнее задание к лекции «Группировки, выборки из нескольких таблиц» +# Домашнее задание к лекции «Продвинутая выборка данных» + +Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. -Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. Внимание! Результаты запросов не должны быть пустыми (при необходимости добавьте данные в таблицы). 1. количество исполнителей в каждом жанре; @@ -13,5 +14,15 @@ 8. исполнителя(-ей), написавшего самый короткий по продолжительности трек (теоретически таких треков может быть несколько); 9. название альбомов, содержащих наименьшее количество треков. -Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). +Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. + +--- + +Результатом работы будет 3 файла в формате `.sql`: + +- с INSERT запросами (из предыдущей домашней работы) +- с SELECT запросами (текущее задание) +- с CREATE запросами (из второй домашней работы) + +> В случае если INSERT и CREATE запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. diff --git a/orm/README.md b/06-orm/README.md similarity index 100% rename from orm/README.md rename to 06-orm/README.md diff --git a/orm/fixtures/tests_data.json b/06-orm/fixtures/tests_data.json similarity index 100% rename from orm/fixtures/tests_data.json rename to 06-orm/fixtures/tests_data.json diff --git a/orm/readme/book_publishers_scheme.png b/06-orm/readme/book_publishers_scheme.png similarity index 100% rename from orm/readme/book_publishers_scheme.png rename to 06-orm/readme/book_publishers_scheme.png diff --git a/README.md b/README.md index 543a057..6b8fec7 100644 --- a/README.md +++ b/README.md @@ -2,5 +2,7 @@ 1. [Введение в БД. Типы БД](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. [Select-запросы, выборки из одной таблицы](dml) -1. [Группировки, выборки из нескольких таблиц](dml-advanced) +1. [Select-запросы, выборки из одной таблицы](./03-dml) +1. [Продвинутая выборка данных](./04-dml-advanced) +1. [Работа с PostgreSQL из Python](./05-psycopg) +1. [Python и БД. ORM](./06-orm) From ebf301bb098398bf0e590b15adc6e7b3014ec0e5 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Sat, 30 Apr 2022 15:39:36 +0300 Subject: [PATCH 03/27] hw6 --- 06-orm/README.md | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/06-orm/README.md b/06-orm/README.md index 635c3a7..bf0832e 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -3,8 +3,10 @@ ## Задание 1 Составить модели классов SQLAlchemy по схеме: -![](readme/book_publishers_scheme.png) -Интуитивно необходимо выбрать подходящие типы и связи полей. + +![](readme/book_publishers_scheme.png) + +Интуитивно необходимо выбрать подходящие типы и связи полей. ## Задание 2 @@ -12,28 +14,23 @@ Напишите Python скрипт, который: -- Подключается к БД любого типа на ваш выбор. +- Подключается к БД любого типа на ваш выбор (например, к PostgreSQL). - Импортирует необходимые модели данных. -- Выполняет запрос для целевого издателя, имя или идентификатор которого принимается через input. - - -## Задание 3.1 (необязательное) +- Выполняет запрос для целевого издателя, имя или идентификатор которого принимается через `input()`. -- Настроить миграции через alembic. Миграция инициализации таблиц создается автоматически на основе модели данных. +## Задание 3 (необязательное) -## Задание 3.2 (необязательное) +Заполните БД тестовыми данными. -- Заполнение тестовых данных через миграцию или внешний скрипт. -- Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON файле. +Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON файле. Возможно несколько вариантов реализации: -1. Парсится json, создаются соотведствующие экземляры моделей и сохраняются в БД. -2. Создаются новые фикстуры взамен JSON на основе [SQLAlchemy-Fixtures](https://sqlalchemy-fixtures.readthedocs.io/en/latest/) или [FactoryBoy](https://github.com/FactoryBoy/factory_boy) +1. Прочитать json-файл, создать соотведствующие экземляры моделей и сохранить в БД. +2. Разобраться с библиотекой [SQLAlchemy-Fixtures](https://sqlalchemy-fixtures.readthedocs.io/en/latest/) и загрузить фикстуры из файла. ## Общие советы: -- Параметры подключения к БД выносятся в отдельные переменные. -- Загружать значения из окружения ОС, например через `os.getenv`. -- Для самотестирования задания 2 рекомендуется выполнить задание 3.1, чтобы не создавать БД вручную или применить [create_all](https://docs.sqlalchemy.org/en/13/core/metadata.html#creating-and-dropping-database-tables). -- Заполнять можно вручную или выполнить 3.2. +- Параметры подключения к БД следует выносить в отдельные переменные (логин, пароль, название БД и пр.) +- Загружать значения лучше из окружения ОС, например через `os.getenv()` +- Заполнять данными можно вручную или выполнить необязательное задание 3 From 5b8a821ceea589badc59d7b7b06254340ee52300 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Sat, 30 Apr 2022 17:57:36 +0300 Subject: [PATCH 04/27] hw5 --- 05-psycopg/README.md | 71 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 05-psycopg/README.md diff --git a/05-psycopg/README.md b/05-psycopg/README.md new file mode 100644 index 0000000..a9069bf --- /dev/null +++ b/05-psycopg/README.md @@ -0,0 +1,71 @@ +# Домашнее задание к лекции «Работа с PostgreSQL из Python» + +Создайте программу для управления клиентами на python. + +Требуется хранить персональную информацию о клиентах: + +- имя +- фамилия +- email +- телефон + +Сложность в том, что телефон у клиента может быть не один, а два, три и даже больше. А может и вообще не быть телефона (например, он не захотел его оставлять). + +Вам необходимо разработать структуру БД для хранения информации и несколько функций на python для управления данными: + +1. Функция, создающая структуру БД (таблицы) +1. Функция, позволяющая добавить нового клиента +1. Функция, позволяющая добавить телефон для существующего клиента +1. Функция, позволяющая изменить данные о клиенте +1. Функция, позволяющая удалить телефон для существующего клиента +1. Функция, позволяющая удалить существующего клиента +1. Функция, позволяющая найти клиента по его данным (имени, фамилии, email-у или телефону) + +Функции выше являются обязательными, но это не значит что должны быть только они. При необходимости можете создавать дополнительные функции и классы. + +Также предоставьте код, демонстрирующий работу всех написанных функций. + +Результатом работы будет `.py` файл. + +--- + +## Подсказка + +> Не читайте этот раздел сразу, попытайтесь сначала решить задачу самостоятельно :) + +
+ +Каркас кода + +```py +import psycopg2 + +def create_db(conn): + pass + +def add_client(conn, first_name, last_name, email, phones=None): + pass + +def add_phone(conn, client_id, phone): + pass + +def change_client(conn, client_id, first_name=None, last_name=None, email=None, phones=None): + pass + +def delete_phone(conn, client_id, phone): + pass + +def delete_client(conn, client_id): + pass + +def find_client(conn, first_name=None, last_name=None, email=None, phone=None): + pass + + +with psycopg2.connect(database="clients_db", user="postgres", password="postgres") as conn: + pass # вызывайте функции здесь + +conn.close() +``` + +
From f28f06f065f52d4708c1d003f1259cbc6eee5679 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Fri, 17 Jun 2022 20:35:57 +0300 Subject: [PATCH 05/27] Update README.md --- 06-orm/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/06-orm/README.md b/06-orm/README.md index bf0832e..2b88764 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -16,7 +16,7 @@ - Подключается к БД любого типа на ваш выбор (например, к PostgreSQL). - Импортирует необходимые модели данных. -- Выполняет запрос для целевого издателя, имя или идентификатор которого принимается через `input()`. +- Выводит издателя (publisher), имя или идентификатор которого принимается через `input()`. ## Задание 3 (необязательное) From dd1bb1035783f57819aaf380e5d7ebb51ba506d0 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Thu, 23 Jun 2022 00:09:26 +0300 Subject: [PATCH 06/27] Fixed README --- 06-orm/README.md | 40 +++++++++++++++++++++++++++--- 06-orm/fixtures/tests_data.json | 43 +++++++++++++++++---------------- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/06-orm/README.md b/06-orm/README.md index 2b88764..f952eac 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -24,10 +24,44 @@ Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON файле. -Возможно несколько вариантов реализации: +Возможная реализация: прочитать json-файл, создать соотведствующие экземляры моделей и сохранить в БД. -1. Прочитать json-файл, создать соотведствующие экземляры моделей и сохранить в БД. -2. Разобраться с библиотекой [SQLAlchemy-Fixtures](https://sqlalchemy-fixtures.readthedocs.io/en/latest/) и загрузить фикстуры из файла. +
+ +Пример реализации, но сначала попытайтесь самостоятельно ;) + +```python +import json + +import sqlalchemy +from sqlalchemy.orm import sessionmaker + +from models import create_tables, Publisher, Shop, Book, Stock, Sale + + +DSN = '...' +engine = sqlalchemy.create_engine(DSN) +create_tables(engine) + +Session = sessionmaker(bind=engine) +session = Session() + +with open('fixtures/tests_data.json', 'r') as fd: + data = json.load(fd) + +for record in data: + model = { + 'publisher': Publisher, + 'shop': Shop, + 'book': Book, + 'stock': Stock, + 'sale': Sale, + }[record.get('model')] + session.add(model(id=record.get('pk'), **record.get('fields'))) +session.commit() +``` + +
## Общие советы: diff --git a/06-orm/fixtures/tests_data.json b/06-orm/fixtures/tests_data.json index 0d33a52..a68fdb8 100644 --- a/06-orm/fixtures/tests_data.json +++ b/06-orm/fixtures/tests_data.json @@ -3,28 +3,29 @@ {"model": "publisher", "pk": 2, "fields": {"name": "Pearson"}}, {"model": "publisher", "pk": 3, "fields": {"name": "Microsoft Press"}}, {"model": "publisher", "pk": 4, "fields": {"name": "No starch press"}}, - {"model": "book", "pk": 1, "fields": {"title": "Programming Python, 4th Edition", "publisher": 1}}, - {"model": "book", "pk": 2, "fields": {"title": "Learning Python, 4th Edition", "publisher": 1}}, - {"model": "book", "pk": 3, "fields": {"title": "Natural Language Processing with Python", "publisher": 1}}, - {"model": "book", "pk": 4, "fields": {"title": "Hacking: The Art of Exploitation", "publisher": 4}}, - {"model": "book", "pk": 5, "fields": {"title": "Modern Operating Systems", "publisher": 2}}, - {"model": "book", "pk": 6, "fields": {"title": "Code Complete: Second Edition", "publisher": 3}}, + {"model": "book", "pk": 1, "fields": {"title": "Programming Python, 4th Edition", "id_publisher": 1}}, + {"model": "book", "pk": 2, "fields": {"title": "Learning Python, 4th Edition", "id_publisher": 1}}, + {"model": "book", "pk": 3, "fields": {"title": "Natural Language Processing with Python", "id_publisher": 1}}, + {"model": "book", "pk": 4, "fields": {"title": "Hacking: The Art of Exploitation", "id_publisher": 4}}, + {"model": "book", "pk": 5, "fields": {"title": "Modern Operating Systems", "id_publisher": 2}}, + {"model": "book", "pk": 6, "fields": {"title": "Code Complete: Second Edition", "id_publisher": 3}}, {"model": "shop", "pk": 1, "fields": {"name": "Labirint"}}, {"model": "shop", "pk": 2, "fields": {"name": "OZON"}}, {"model": "shop", "pk": 3, "fields": {"name": "Amazon"}}, - {"model": "stock", "pk": 1, "fields": {"shop": 1, "book": 1, "count": 34}}, - {"model": "stock", "pk": 2, "fields": {"shop": 1, "book": 2, "count": 30}}, - {"model": "stock", "pk": 3, "fields": {"shop": 1, "book": 3, "count": 0}}, - {"model": "stock", "pk": 4, "fields": {"shop": 2, "book": 5, "count": 40}}, - {"model": "stock", "pk": 5, "fields": {"shop": 2, "book": 6, "count": 50}}, - {"model": "stock", "pk": 6, "fields": {"shop": 3, "book": 4, "count": 10}}, - {"model": "stock", "pk": 7, "fields": {"shop": 3, "book": 6, "count": 10}}, - {"model": "stock", "pk": 8, "fields": {"shop": 2, "book": 1, "count": 10}}, - {"model": "stock", "pk": 9, "fields": {"shop": 3, "book": 1, "count": 10}}, - {"model": "sale", "pk": 1, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:45:24.552Z", "count": 16, "stock": 1}}, - {"model": "sale", "pk": 2, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:51:04.113Z", "count": 10, "stock": 3}}, - {"model": "sale", "pk": 3, "fields": {"price": "10.50", "date_sale": "2018-10-25T09:52:22.194Z", "count": 9, "stock": 6}}, - {"model": "sale", "pk": 4, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "stock": 5}}, - {"model": "sale", "pk": 5, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "stock": 9}}, - {"model": "sale", "pk": 6, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 1, "stock": 4}}, + {"model": "stock", "pk": 1, "fields": {"id_shop": 1, "id_book": 1, "count": 34}}, + {"model": "stock", "pk": 2, "fields": {"id_shop": 1, "id_book": 2, "count": 30}}, + {"model": "stock", "pk": 3, "fields": {"id_shop": 1, "id_book": 3, "count": 0}}, + {"model": "stock", "pk": 4, "fields": {"id_shop": 2, "id_book": 5, "count": 40}}, + {"model": "stock", "pk": 5, "fields": {"id_shop": 2, "id_book": 6, "count": 50}}, + {"model": "stock", "pk": 6, "fields": {"id_shop": 3, "id_book": 4, "count": 10}}, + {"model": "stock", "pk": 7, "fields": {"id_shop": 3, "id_book": 6, "count": 10}}, + {"model": "stock", "pk": 8, "fields": {"id_shop": 2, "id_book": 1, "count": 10}}, + {"model": "stock", "pk": 9, "fields": {"id_shop": 3, "id_book": 1, "count": 10}}, + {"model": "sale", "pk": 1, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:45:24.552Z", "count": 16, "id_stock": 1}}, + {"model": "sale", "pk": 2, "fields": {"price": "50.05", "date_sale": "2018-10-25T09:51:04.113Z", "count": 10, "id_stock": 3}}, + {"model": "sale", "pk": 3, "fields": {"price": "10.50", "date_sale": "2018-10-25T09:52:22.194Z", "count": 9, "id_stock": 6}}, + {"model": "sale", "pk": 4, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "id_stock": 5}}, + {"model": "sale", "pk": 5, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 5, "id_stock": 9}}, + {"model": "sale", "pk": 6, "fields": {"price": "16.00", "date_sale": "2018-10-25T10:59:56.230Z", "count": 1, "id_stock": 4}} ] + From f00cadd76703a7bd7b2e70bbd9dab9524db67cec Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Wed, 9 Nov 2022 02:52:37 +0300 Subject: [PATCH 07/27] Update README.md --- 06-orm/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/06-orm/README.md b/06-orm/README.md index f952eac..55cc4f2 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -6,6 +6,8 @@ ![](readme/book_publishers_scheme.png) +Легенда: система хранит информацию об издателях (авторах), их книгах и фактах продажи. Книги могут продаваться в разных магазинах, поэтому требуется учитывать не только, что за книга была продана, но и в каком магазине это было сделано, а также когда. + Интуитивно необходимо выбрать подходящие типы и связи полей. ## Задание 2 @@ -16,7 +18,21 @@ - Подключается к БД любого типа на ваш выбор (например, к PostgreSQL). - Импортирует необходимые модели данных. -- Выводит издателя (publisher), имя или идентификатор которого принимается через `input()`. +- Принимает имя или идентификатор издателя (publisher), например через `input()`. Выводит построчно факты покупки книг этого издателя: + +``` +название книги | название магазина, в котором была куплена эта книга | стоимость покупки | дата покупки +``` + +Пример (было введено имя автора - `Пушкин`): + +``` +Капитанская дочка | Буквоед | 600 | 09-11-2022 +Руслан и Людмила | Буквоед | 500 | 08-11-2022 +Капитанская дочка | Лабиринт | 580 | 05-11-2022 +Евгений Онегин | Книжный дом | 490 | 02-11-2022 +Капитанская дочка | Буквоед | 600 | 26-10-2022 +``` ## Задание 3 (необязательное) From 920c5b88a0d21c4500ea51baec02d2400dacfa67 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Tue, 13 Dec 2022 11:48:10 +0300 Subject: [PATCH 08/27] Update README.md --- 01-introduction/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-introduction/README.md b/01-introduction/README.md index 91ae088..103748f 100644 --- a/01-introduction/README.md +++ b/01-introduction/README.md @@ -47,7 +47,7 @@ sudo apt update && sudo apt install pgadmin4 ### Mac OS X -[Видео-инструкция](https://kinescope.io/200639959) +[Видео-инструкция](https://clck.ru/32zuuG) Команды для установки: From e661cf82e9ca31caa3ec9c745ae6c79eaad998e3 Mon Sep 17 00:00:00 2001 From: Evgeny Shmargunov Date: Wed, 25 Jan 2023 13:19:53 +0300 Subject: [PATCH 09/27] Update README.md --- 01-introduction/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-introduction/README.md b/01-introduction/README.md index 103748f..f27121b 100644 --- a/01-introduction/README.md +++ b/01-introduction/README.md @@ -52,7 +52,7 @@ sudo apt update && sudo apt install pgadmin4 Команды для установки: ```bash -brew install postgres +brew install postgresql postgres -V From a8162767069f272df6258ba06fcb7e9b494e4efd Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:21:38 +0300 Subject: [PATCH 10/27] Update README.md --- 01-introduction/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/01-introduction/README.md b/01-introduction/README.md index f27121b..01f39c5 100644 --- a/01-introduction/README.md +++ b/01-introduction/README.md @@ -2,16 +2,16 @@ ## Задание 1 (практика) -Спроектировать схему (таблицы и связи между ними) для музыкального сайта. Требования: +Спроектировать схему — таблицы и связи между ними — для музыкального сайта. Требования: -- На сайте должна быть возможность увидеть список музыкальных жанров. -- Для каждого жанра можно получить список исполнителей, которые исполняют в соответствующем жанре. -- Для каждого исполнителя можно получить список его альбомов. -- Для каждого альбома можно получить список треков, которые в него входят. -- У жанра есть название. -- У исполнителя есть имя (псевдоним) и жанр, в котором он исполняет. -- У альбома есть название, год выпуска и его исполнитель. -- У трека есть название, длительность и альбом, которому этот трек принадлежит. +- на сайте должна быть возможность увидеть список музыкальных жанров; +- для каждого жанра можно получить список исполнителей, которые выступают в соответствующем жанре; +- для каждого исполнителя можно получить список его альбомов; +- для каждого альбома можно получить список треков, которые в него входят; +- у жанра есть название; +- у исполнителя есть имя (псевдоним) и жанр, в котором он исполняет; +- у альбома есть название, год выпуска и его исполнитель; +- у трека есть название, длительность и альбом, которому этот трек принадлежит. Результатом работы является изображение в формате PNG, содержащее схему БД. @@ -25,13 +25,13 @@ ### Windows -[Видео-инструкция](https://embed.new.video/uyjUq9B3qYo6BbbkzG71Ny) +[Видеоинструкция](https://embed.new.video/uyjUq9B3qYo6BbbkzG71Ny). -[Ссылка на PostgreSQL для Windows](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) +[Ссылка на PostgreSQL для Windows](https://www.enterprisedb.com/downloads/postgres-postgresql-downloads). ### Linux (на примере Ubuntu 20.04) -[Видео-инструкция](https://embed.new.video/cRQW4Z2YnxZUxzKRLWwnPF) +[Видеоинструкция](https://embed.new.video/cRQW4Z2YnxZUxzKRLWwnPF). Команды для установки: @@ -47,7 +47,7 @@ sudo apt update && sudo apt install pgadmin4 ### Mac OS X -[Видео-инструкция](https://clck.ru/32zuuG) +[Видеоинструкция](https://clck.ru/32zuuG) Команды для установки: @@ -63,6 +63,6 @@ createuser -P -s postgres ## Задание 3 (подготовка к следующей лекции) -На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. Это бесплатная программа, вы можете заранее скачать ее [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер. +На следующей лекции мы будем использовать программу DBeaver Community для работы с СУБД. Это бесплатная программа, вы можете заранее скачать её [по ссылке](https://dbeaver.io/download/) и установить на свой компьютер. -Обратите внимание, что данное задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже (или даже вообще использовать что-то другое). +Обратите внимание, что это задание является рекомендацией, для полноценного участия в лекции DBeaver вам не потребуется, вы можете установить эту программу позже или вообще использовать что-то другое. From 8114531893b333fa429980ca8352c743defb41bc Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:28:20 +0300 Subject: [PATCH 11/27] Update README.md --- 02-creation/README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/02-creation/README.md b/02-creation/README.md index ac3e064..1dba0bf 100644 --- a/02-creation/README.md +++ b/02-creation/README.md @@ -6,33 +6,33 @@ Будем развивать схему для музыкального сервиса. -Ранее было ограничение, что каждый исполнитель поет строго в одном жанре - пора убрать это ограничение. Исполнители могут петь в разных жанрах, как и одному жанру могут принадлежать несколько исполнителей. +Ранее существовало ограничение, что каждый исполнитель поёт строго в одном жанре, пора его убрать. Исполнители могут петь в разных жанрах, как и одному жанру могут принадлежать несколько исполнителей. -Аналогичное ограничение было и с альбомами у исполнителей (альбом мог выпустить только один исполнитель). Теперь альбом могут выпустить несколько исполнителей вместе. Как и исполнитель может принимать участие во множестве альбомов. +Аналогичное ограничение было и с альбомами у исполнителей — альбом мог выпустить только один исполнитель. Теперь альбом могут выпустить несколько исполнителей вместе. Как и исполнитель может принимать участие во множестве альбомов. -С треками ничего не меняем, все так же трек принадлежит строго одному альбому. +С треками ничего не меняем, всё так же трек принадлежит строго одному альбому. -Но появилась новая сущность - сборник. Сборник имеет название и год выпуска. В него входят различные треки из разных альбомов. +Но появилась новая сущность — сборник. Сборник имеет название и год выпуска. В него входят различные треки из разных альбомов. _Обратите внимание_: один и тот же трек может присутствовать в разных сборниках. -Задание состоит из двух частей: +Задание состоит из двух частей -1. Спроектировать и нарисовать схему (как в [первой домашней работе](../01-introduction)). Прислать изображение со схемой. +1. Спроектировать и нарисовать схему, как в [первой домашней работе](../01-introduction). Прислать изображение со схемой. 2. Написать SQL-запросы, создающие спроектированную БД. Прислать ссылку на файл, содержащий SQL-запросы. -_Примечание:_ можно прислать сначала схему, получить подтверждение, что схема верная и после этого браться за написание запросов. +_Примечание:_ можно прислать сначала схему, получить подтверждение, что схема верная, и после этого браться за написание запросов. --- ### Дополнительное (необязательное) задание -Спроектировать отношение (или схему из нескольких отношений) "Сотрудник". У каждого сотрудника есть следующие параметры: +Спроектировать отношение или схему из нескольких отношений «Сотрудник». У каждого сотрудника есть следующие параметры: -1. Имя -2. Отдел -3. Начальник (ссылка на начальника) +1. Имя. +2. Отдел. +3. Начальник (ссылка на начальника). -_Примечание:_ начальник - тоже сотрудник. Отдел можно хранить строкой, можно идентификатором (не принципиально). +_Примечание:_ начальник — тоже сотрудник. Отдел можно хранить строкой, можно идентификатором — не принципиально. -Необходимо написать SQL-запрос, создающий таблицу "Сотрудник", и прислать ссылку на файл с этим запросом. +Необходимо написать SQL-запрос, создающий таблицу «Сотрудник», и прислать ссылку на файл с этим запросом. From 889e82a1f3116ad5b85dc3336ccca791d3c94b92 Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:33:45 +0300 Subject: [PATCH 12/27] Update README.md --- 03-dml/README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/03-dml/README.md b/03-dml/README.md index 86e016b..ba7ceaf 100644 --- a/03-dml/README.md +++ b/03-dml/README.md @@ -1,34 +1,34 @@ -# Домашнее задание к лекции «Select-запросы, выборки из одной таблицы» +# Домашнее задание к лекции «SELECT-запросы, выборки из одной таблицы» ## Задание 1 Заполните базу данных из предыдущего домашнего задания. В ней должно быть: -- не менее 8 исполнителей; -- не менее 5 жанров; -- не менее 8 альбомов; -- не менее 15 треков; +- не менее 8 исполнителей, +- не менее 5 жанров, +- не менее 8 альбомов, +- не менее 15 треков, - не менее 8 сборников. -Внимание! Должны быть заполнены все поля каждой таблицы, в т.ч. таблицы связей (исполнителей с жанрами, исполнителей с альбомами, сборников с треками). +Внимание: должны быть заполнены все поля каждой таблицы, в том числе таблицы связей исполнителей с жанрами, исполнителей с альбомами, сборников с треками. ## Задание 2 Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. -Внимание! Результаты запросов не должны быть пустыми (учтите при заполнении таблиц). +Внимание: результаты запросов не должны быть пустыми, учтите это при заполнении таблиц. -1. название и год выхода альбомов, вышедших в 2018 году; -2. название и продолжительность самого длительного трека; -3. название треков, продолжительность которых не менее 3,5 минуты; -4. названия сборников, вышедших в период с 2018 по 2020 год включительно; -5. исполнители, чье имя состоит из 1 слова; -6. название треков, которые содержат слово "мой"/"my". +1. Название и год выхода альбомов, вышедших в 2018 году. +2. Название и продолжительность самого длительного трека. +3. Название треков, продолжительность которых не менее 3,5 минут. +4. Названия сборников, вышедших в период с 2018 по 2020 год включительно. +5. Исполнители, чьё имя состоит из одного слова. +6. Название треков, которые содержат слово «мой» или «my». --- -Результатом работы будет 3 файла в формате `.sql`: +Результатом работы будет три файла в формате `.sql`: -- с INSERT запросами (задание 1) -- с SELECT запросами (задание 2) -- с CREATE запросами (из предыдущей домашней работы) +- с INSERT-запросами (задание 1), +- с SELECT-запросами (задание 2), +- с CREATE-запросами (из предыдущей домашней работы). From 014f074a1819619b87e5ec20c45815d077eb8f95 Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:38:55 +0300 Subject: [PATCH 13/27] Update README.md --- 04-dml-advanced/README.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/04-dml-advanced/README.md b/04-dml-advanced/README.md index 1125b4b..4c57c6f 100644 --- a/04-dml-advanced/README.md +++ b/04-dml-advanced/README.md @@ -2,27 +2,27 @@ Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. -Внимание! Результаты запросов не должны быть пустыми (при необходимости добавьте данные в таблицы). - -1. количество исполнителей в каждом жанре; -2. количество треков, вошедших в альбомы 2019-2020 годов; -3. средняя продолжительность треков по каждому альбому; -4. все исполнители, которые не выпустили альбомы в 2020 году; -5. названия сборников, в которых присутствует конкретный исполнитель (выберите сами); -6. название альбомов, в которых присутствуют исполнители более 1 жанра; -7. наименование треков, которые не входят в сборники; -8. исполнителя(-ей), написавшего самый короткий по продолжительности трек (теоретически таких треков может быть несколько); -9. название альбомов, содержащих наименьшее количество треков. - -Результатом работы будет 3 файла (с INSERT, SELECT запросами и CREATE запросами из предыдущего задания) в формате .sql (или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy). +Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы. + +1. Количество исполнителей в каждом жанре. +2. Количество треков, вошедших в альбомы 2019–2020 годов. +3. Средняя продолжительность треков по каждому альбому. +4. Все исполнители, которые не выпустили альбомы в 2020 году. +5. Названия сборников, в которых присутствует конкретный исполнитель (выберите его сами). +6. Названия альбомов, в которых присутствуют исполнители более чем одного жанра. +7. Наименования треков, которые не входят в сборники. +8. Исполнитель или исполнители, написавшие самый короткий по продолжительности трек, — теоретически таких треков может быть несколько. +9. Названия альбомов, содержащих наименьшее количество треков. + +Результатом работы будут три файла: с INSERT-, SELECT-запросами и CREATE-запросами из предыдущего задания в формате .sql или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy. В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. --- -Результатом работы будет 3 файла в формате `.sql`: +Результатом работы будут три файла в формате `.sql`: -- с INSERT запросами (из предыдущей домашней работы) -- с SELECT запросами (текущее задание) -- с CREATE запросами (из второй домашней работы) +- с INSERT-запросами (из предыдущей домашней работы), +- с SELECT-запросами (текущее задание), +- с CREATE-запросами (из второй домашней работы). -> В случае если INSERT и CREATE запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. +> В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. From 112daa6f4f2f82f288e64b61a314c537acd83c52 Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:42:22 +0300 Subject: [PATCH 14/27] Update README.md --- 05-psycopg/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/05-psycopg/README.md b/05-psycopg/README.md index a9069bf..266002a 100644 --- a/05-psycopg/README.md +++ b/05-psycopg/README.md @@ -1,27 +1,27 @@ # Домашнее задание к лекции «Работа с PostgreSQL из Python» -Создайте программу для управления клиентами на python. +Создайте программу для управления клиентами на Python. Требуется хранить персональную информацию о клиентах: -- имя -- фамилия -- email -- телефон +- имя, +- фамилия, +- email, +- телефон. -Сложность в том, что телефон у клиента может быть не один, а два, три и даже больше. А может и вообще не быть телефона (например, он не захотел его оставлять). +Сложность в том, что телефон у клиента может быть не один, а два, три и даже больше. А может и вообще не быть телефона, например, он не захотел его оставлять. -Вам необходимо разработать структуру БД для хранения информации и несколько функций на python для управления данными: +Вам необходимо разработать структуру БД для хранения информации и несколько функций на Python для управления данными. -1. Функция, создающая структуру БД (таблицы) -1. Функция, позволяющая добавить нового клиента -1. Функция, позволяющая добавить телефон для существующего клиента -1. Функция, позволяющая изменить данные о клиенте -1. Функция, позволяющая удалить телефон для существующего клиента -1. Функция, позволяющая удалить существующего клиента -1. Функция, позволяющая найти клиента по его данным (имени, фамилии, email-у или телефону) +1. Функция, создающая структуру БД (таблицы). +1. Функция, позволяющая добавить нового клиента. +1. Функция, позволяющая добавить телефон для существующего клиента. +1. Функция, позволяющая изменить данные о клиенте. +1. Функция, позволяющая удалить телефон для существующего клиента. +1. Функция, позволяющая удалить существующего клиента. +1. Функция, позволяющая найти клиента по его данным: имени, фамилии, email или телефону. -Функции выше являются обязательными, но это не значит что должны быть только они. При необходимости можете создавать дополнительные функции и классы. +Функции выше являются обязательными, но это не значит, что должны быть только они. При необходимости можете создавать дополнительные функции и классы. Также предоставьте код, демонстрирующий работу всех написанных функций. From d0267b49c83428c7c2bdcc59dc4a00073fe2ff43 Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:47:40 +0300 Subject: [PATCH 15/27] Update README.md --- 06-orm/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/06-orm/README.md b/06-orm/README.md index 55cc4f2..b28d94f 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -6,7 +6,7 @@ ![](readme/book_publishers_scheme.png) -Легенда: система хранит информацию об издателях (авторах), их книгах и фактах продажи. Книги могут продаваться в разных магазинах, поэтому требуется учитывать не только, что за книга была продана, но и в каком магазине это было сделано, а также когда. +Легенда: система хранит информацию об издателях (авторах), их книгах и фактах продажи. Книги могут продаваться в разных магазинах, поэтому требуется учитывать не только что за книга была продана, но и в каком магазине это было сделано, а также когда. Интуитивно необходимо выбрать подходящие типы и связи полей. @@ -14,17 +14,17 @@ Используя SQLAlchemy, составить запрос выборки магазинов, продающих целевого издателя. -Напишите Python скрипт, который: +Напишите Python-скрипт, который: -- Подключается к БД любого типа на ваш выбор (например, к PostgreSQL). -- Импортирует необходимые модели данных. -- Принимает имя или идентификатор издателя (publisher), например через `input()`. Выводит построчно факты покупки книг этого издателя: +- подключается к БД любого типа на ваш выбор, например, к PostgreSQL; +- импортирует необходимые модели данных; +- принимает имя или идентификатор издателя (publisher), например, через `input()`. Выводит построчно факты покупки книг этого издателя: ``` название книги | название магазина, в котором была куплена эта книга | стоимость покупки | дата покупки ``` -Пример (было введено имя автора - `Пушкин`): +Пример (было введено имя автора — `Пушкин`): ``` Капитанская дочка | Буквоед | 600 | 09-11-2022 From dada0c0124123cfedb5c2b5c2e732f892015cc72 Mon Sep 17 00:00:00 2001 From: EleShvili <112869507+EleShvili@users.noreply.github.com> Date: Wed, 22 Feb 2023 16:48:58 +0300 Subject: [PATCH 16/27] Update README.md --- 06-orm/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/06-orm/README.md b/06-orm/README.md index b28d94f..d4c55c5 100644 --- a/06-orm/README.md +++ b/06-orm/README.md @@ -38,9 +38,9 @@ Заполните БД тестовыми данными. -Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON файле. +Тестовые данные берутся из папки `fixtures`. Пример содержания в JSON-файле. -Возможная реализация: прочитать json-файл, создать соотведствующие экземляры моделей и сохранить в БД. +Возможная реализация: прочитать JSON-файл, создать соотведствующие экземляры моделей и сохранить в БД.
@@ -79,8 +79,8 @@ session.commit()
-## Общие советы: +## Общие советы -- Параметры подключения к БД следует выносить в отдельные переменные (логин, пароль, название БД и пр.) -- Загружать значения лучше из окружения ОС, например через `os.getenv()` -- Заполнять данными можно вручную или выполнить необязательное задание 3 +- Параметры подключения к БД следует выносить в отдельные переменные: логин, пароль, название БД и пр. +- Загружать значения лучше из окружения ОС, например, через `os.getenv()`. +- Заполнять данными можно вручную или выполнить необязательное задание 3. From 6fa8984780c42bbe6834f808cf93dd8c96a5afde Mon Sep 17 00:00:00 2001 From: "shmargunov.e" Date: Mon, 13 Mar 2023 22:32:39 +0300 Subject: [PATCH 17/27] new hw --- 03-dml/README.md | 34 ----------------------- 04-dml-advanced/README.md | 28 ------------------- 04-dml/README.md | 58 +++++++++++++++++++++++++++++++++++++++ README.md | 3 +- 4 files changed, 59 insertions(+), 64 deletions(-) delete mode 100644 03-dml/README.md delete mode 100644 04-dml-advanced/README.md create mode 100644 04-dml/README.md diff --git a/03-dml/README.md b/03-dml/README.md deleted file mode 100644 index ba7ceaf..0000000 --- a/03-dml/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Домашнее задание к лекции «SELECT-запросы, выборки из одной таблицы» - -## Задание 1 - -Заполните базу данных из предыдущего домашнего задания. В ней должно быть: - -- не менее 8 исполнителей, -- не менее 5 жанров, -- не менее 8 альбомов, -- не менее 15 треков, -- не менее 8 сборников. - -Внимание: должны быть заполнены все поля каждой таблицы, в том числе таблицы связей исполнителей с жанрами, исполнителей с альбомами, сборников с треками. - -## Задание 2 - -Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. - -Внимание: результаты запросов не должны быть пустыми, учтите это при заполнении таблиц. - -1. Название и год выхода альбомов, вышедших в 2018 году. -2. Название и продолжительность самого длительного трека. -3. Название треков, продолжительность которых не менее 3,5 минут. -4. Названия сборников, вышедших в период с 2018 по 2020 год включительно. -5. Исполнители, чьё имя состоит из одного слова. -6. Название треков, которые содержат слово «мой» или «my». - ---- - -Результатом работы будет три файла в формате `.sql`: - -- с INSERT-запросами (задание 1), -- с SELECT-запросами (задание 2), -- с CREATE-запросами (из предыдущей домашней работы). diff --git a/04-dml-advanced/README.md b/04-dml-advanced/README.md deleted file mode 100644 index 4c57c6f..0000000 --- a/04-dml-advanced/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Домашнее задание к лекции «Продвинутая выборка данных» - -Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. - -Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы. - -1. Количество исполнителей в каждом жанре. -2. Количество треков, вошедших в альбомы 2019–2020 годов. -3. Средняя продолжительность треков по каждому альбому. -4. Все исполнители, которые не выпустили альбомы в 2020 году. -5. Названия сборников, в которых присутствует конкретный исполнитель (выберите его сами). -6. Названия альбомов, в которых присутствуют исполнители более чем одного жанра. -7. Наименования треков, которые не входят в сборники. -8. Исполнитель или исполнители, написавшие самый короткий по продолжительности трек, — теоретически таких треков может быть несколько. -9. Названия альбомов, содержащих наименьшее количество треков. - -Результатом работы будут три файла: с INSERT-, SELECT-запросами и CREATE-запросами из предыдущего задания в формате .sql или .py/.ipynb, если вы будете писать запросы с использованием SQLAlchemy. -В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. - ---- - -Результатом работы будут три файла в формате `.sql`: - -- с INSERT-запросами (из предыдущей домашней работы), -- с SELECT-запросами (текущее задание), -- с CREATE-запросами (из второй домашней работы). - -> В случае если INSERT- и CREATE-запросы остались без изменений, приложите файлы c ними из предыдущих домашних заданий. diff --git a/04-dml/README.md b/04-dml/README.md new file mode 100644 index 0000000..30a3daa --- /dev/null +++ b/04-dml/README.md @@ -0,0 +1,58 @@ +# Домашнее задание к лекции «SELECT-запросы, выборки из одной таблицы» + +## Задание 1 + +Заполните базу данных из предыдущего домашнего задания. В ней должно быть: + +- не менее 4 исполнителей, +- не менее 3 жанров, +- не менее 3 альбомов, +- не менее 6 треков, +- не менее 4 сборников. + +Внимание: должны быть заполнены все поля каждой таблицы, в том числе таблицы связей исполнителей с жанрами, исполнителей с альбомами, сборников с треками. + +## Задание 2 + +Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. + +Внимание: результаты запросов не должны быть пустыми, учтите это при заполнении таблиц. + +1. Название и продолжительность самого длительного трека. +2. Название треков, продолжительность которых не менее 3,5 минут. +3. Названия сборников, вышедших в период с 2018 по 2020 год включительно. +4. Исполнители, чьё имя состоит из одного слова. +5. Название треков, которые содержат слово «мой» или «my». + + +## Задание 3 + +Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. + +Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы. + +1. Количество исполнителей в каждом жанре. +2. Количество треков, вошедших в альбомы 2019–2020 годов. +3. Средняя продолжительность треков по каждому альбому. +4. Все исполнители, которые не выпустили альбомы в 2020 году. +5. Названия сборников, в которых присутствует конкретный исполнитель (выберите его сами). + + +## Задание 4(необязательное) + +Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. + +Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы. + +1. Названия альбомов, в которых присутствуют исполнители более чем одного жанра. +2. Наименования треков, которые не входят в сборники. +3. Исполнитель или исполнители, написавшие самый короткий по продолжительности трек, — теоретически таких треков может быть несколько. +4. Названия альбомов, содержащих наименьшее количество треков. + +--- + +Результатом работы будет три файла в формате `.sql`: + +- с INSERT-запросами (задание 1), +- с SELECT-запросами (задание 2,3,4), +- с CREATE-запросами (из предыдущей домашней работы). diff --git a/README.md b/README.md index 6b8fec7..7ad26e5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ 1. [Введение в БД. Типы БД](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. [Select-запросы, выборки из одной таблицы](./03-dml) -1. [Продвинутая выборка данных](./04-dml-advanced) +1. [Select-запросы, продвинутая выборка данных](./04-dml) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From c8cee744436ed44df55d5a0ef29e75e7a6b39f32 Mon Sep 17 00:00:00 2001 From: "shmargunov.e" Date: Mon, 13 Mar 2023 22:33:41 +0300 Subject: [PATCH 18/27] new hw --- 04-dml/README.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/04-dml/README.md b/04-dml/README.md index 30a3daa..aedf5b2 100644 --- a/04-dml/README.md +++ b/04-dml/README.md @@ -1,4 +1,4 @@ -# Домашнее задание к лекции «SELECT-запросы, выборки из одной таблицы» +# Домашнее задание к лекции «Select-запросы» ## Задание 1 diff --git a/README.md b/README.md index 7ad26e5..676774e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ 1. [Введение в БД. Типы БД](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. [Select-запросы, продвинутая выборка данных](./04-dml) +1. [Select-запросы](./04-dml) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From d22debe0aa0c9ce96bc37ad057511207a8701841 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Tue, 21 Mar 2023 17:50:54 +0300 Subject: [PATCH 19/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 676774e..74d4591 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ 1. [Введение в БД. Типы БД](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. [Select-запросы](./04-dml) +1. Select-запросы (домашнее задание представлено в формате работы с тренажёрами в личном кабинете) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From 5328afd5b76eeced31bce4f86284098be9bffd87 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Tue, 21 Mar 2023 17:51:17 +0300 Subject: [PATCH 20/27] Update README.md From f27ffe306a417a7937468afb128ddb1b0657b2ba Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Thu, 30 Mar 2023 19:31:26 +0300 Subject: [PATCH 21/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74d4591..676774e 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,6 @@ 1. [Введение в БД. Типы БД](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. Select-запросы (домашнее задание представлено в формате работы с тренажёрами в личном кабинете) +1. [Select-запросы](./04-dml) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From c643e679b457a941d6427b9e6bf6698c18a6fec3 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:29:56 +0300 Subject: [PATCH 22/27] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 676774e..f586b79 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # Домашние задания на курсе «Python. Базы данных» -1. [Введение в БД. Типы БД](./01-introduction) +1. [Введение в базы данных. Типы баз данных](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. [Select-запросы](./04-dml) +1. Select-запросы, выборки из одной таблицы (домашее задание предполагает работу с тренажёрами в личном кабинете) +1. [Продвинутая выборка данных](./04-dml) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From a0bcc5709f1b6c9cef09c6802393d29d33d08eb2 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:31:40 +0300 Subject: [PATCH 23/27] Update README.md --- 04-dml/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/04-dml/README.md b/04-dml/README.md index aedf5b2..c0b3d6c 100644 --- a/04-dml/README.md +++ b/04-dml/README.md @@ -1,8 +1,8 @@ -# Домашнее задание к лекции «Select-запросы» +# Домашнее задание к лекции «Продвинутая выборка данных» ## Задание 1 -Заполните базу данных из предыдущего домашнего задания. В ней должно быть: +Продолжаем работать со своей базой данных. В этом задании заполните базу данных из домашнего задания к занятию "Работа с SQL. Создание БД". В ней должно быть: - не менее 4 исполнителей, - не менее 3 жанров, From cb8e8258e03984e66ec96ce3e48b6f378b333155 Mon Sep 17 00:00:00 2001 From: okskharitonova <92102127+okskharitonova@users.noreply.github.com> Date: Fri, 31 Mar 2023 11:36:01 +0300 Subject: [PATCH 24/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f586b79..5af9df7 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 1. [Введение в базы данных. Типы баз данных](./01-introduction) 1. [Работа с SQL. Создание БД](./02-creation) -1. Select-запросы, выборки из одной таблицы (домашее задание предполагает работу с тренажёрами в личном кабинете) +1. Select-запросы, выборки из одной таблицы (чтобы прокачать свои навыки работы с запросами в БД, выполните задания с тренажёрами в своём личном кабинете) 1. [Продвинутая выборка данных](./04-dml) 1. [Работа с PostgreSQL из Python](./05-psycopg) 1. [Python и БД. ORM](./06-orm) From 08c8d4655ca8a33d24e9954f0f7ec606d6d6f861 Mon Sep 17 00:00:00 2001 From: Alexander Ivanov Date: Thu, 7 Mar 2024 17:15:18 +0100 Subject: [PATCH 25/27] Update README.md --- 01-introduction/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01-introduction/README.md b/01-introduction/README.md index 01f39c5..cee8227 100644 --- a/01-introduction/README.md +++ b/01-introduction/README.md @@ -17,7 +17,7 @@ Для создания схем можно воспользоваться удобной платформой [app.diagrams.net](https://app.diagrams.net/) или любым другим графическим редактором. -[Краткая шпаргалка](https://docs.google.com/document/d/1KUagjHQQHIQYS2-qI0lgiV2wNxKdi00Q_Xw0nK7t3PA/edit?usp=sharing) по созданию схем БД на платформе [app.diagrams.net](https://app.diagrams.net/). +Краткая шпаргалка по созданию схем БД на платформе [app.diagrams.net](https://app.diagrams.net/) находится в личном кабинете в занятии «Введение в базы данных. Типы баз данных». ## Задание 2 (подготовка к следующей лекции) From f4815e100b46322c46bcc8126a09499d0d188390 Mon Sep 17 00:00:00 2001 From: Denis <129361495+bezymel@users.noreply.github.com> Date: Tue, 7 May 2024 21:17:50 +0300 Subject: [PATCH 26/27] Update README.md --- 04-dml/README.md | 86 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/04-dml/README.md b/04-dml/README.md index c0b3d6c..aa793e5 100644 --- a/04-dml/README.md +++ b/04-dml/README.md @@ -12,6 +12,69 @@ Внимание: должны быть заполнены все поля каждой таблицы, в том числе таблицы связей исполнителей с жанрами, исполнителей с альбомами, сборников с треками. +## Ответ 1 + +CREATE TABLE Исполнители ( + Идентификатор INT PRIMARY KEY, + Имя VARCHAR(255) +); + +CREATE TABLE Жанры ( + Идентификатор INT PRIMARY KEY, + Название VARCHAR(255) +); + +CREATE TABLE Альбомы ( + Идентификатор INT PRIMARY KEY, + Название VARCHAR(255), + Год_выпуска INT +); + +CREATE TABLE Треки ( + Идентификатор INT PRIMARY KEY, + Название VARCHAR(255), + Идентификатор_альбома INT, + FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор) +); + +CREATE TABLE Сборники ( + Идентификатор INT PRIMARY KEY, + Название VARCHAR(255), + Год_выпуска INT +); + +CREATE TABLE Исполнители_Жанры ( + Идентификатор INT PRIMARY KEY, + Идентификатор_исполнителя INT, + Идентификатор_жанра INT, + FOREIGN KEY (Идентификатор_исполнителя) REFERENCES Исполнители(Идентификатор), + FOREIGN KEY (Идентификатор_жанра) REFERENCES Жанры(Идентификатор) +); + +CREATE TABLE Исполнители_Альбомы ( + Идентификатор INT PRIMARY KEY, + Идентификатор_исполнителя INT, + Идентификатор_альбома INT, + FOREIGN KEY (Идентификатор_исполнителя) REFERENCES Исполнители(Идентификатор), + FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор) +); + +CREATE TABLE Альбомы_Треки ( + Идентификатор INT PRIMARY KEY, + Идентификатор_альбома INT, + Идентификатор_трека INT, + FOREIGN KEY (Идентификатор_альбома) REFERENCES Альбомы(Идентификатор), + FOREIGN KEY (Идентификатор_трека) REFERENCES Треки(Идентификатор) +); + +CREATE TABLE Сборники_Треки ( + Идентификатор INT PRIMARY KEY, + Идентификатор_сборника INT, + Идентификатор_трека INT, + FOREIGN KEY (Идентификатор_сборника) REFERENCES Сборники(Идентификатор), + FOREIGN KEY (Идентификатор_трека) REFERENCES Треки(Идентификатор) +); + ## Задание 2 Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. @@ -25,6 +88,29 @@ 5. Название треков, которые содержат слово «мой» или «my». +## Ответ 2 + +SELECT Название, Продолжительность +FROM Треки +WHERE Продолжительность = (SELECT MAX(Продолжительность) FROM Треки); + +SELECT Название +FROM Треки +WHERE Продолжительность >= 3.5; + +SELECT Название +FROM Сборники +WHERE Год_выпуска BETWEEN 2018 AND 2020; + +SELECT Имя +FROM Исполнители +WHERE Имя NOT LIKE '% %'; + +SELECT Название +FROM Треки +WHERE Название LIKE '%мой%' OR Название LIKE '%my%'; + + ## Задание 3 Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. From 47dfe76607de451770517ca96b2c91e2d9ab5fc1 Mon Sep 17 00:00:00 2001 From: Denis <129361495+bezymel@users.noreply.github.com> Date: Tue, 7 May 2024 21:23:45 +0300 Subject: [PATCH 27/27] Update README.md --- 04-dml/README.md | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/04-dml/README.md b/04-dml/README.md index aa793e5..e532571 100644 --- a/04-dml/README.md +++ b/04-dml/README.md @@ -123,17 +123,34 @@ WHERE Название LIKE '%мой%' OR Название LIKE '%my%'; 4. Все исполнители, которые не выпустили альбомы в 2020 году. 5. Названия сборников, в которых присутствует конкретный исполнитель (выберите его сами). +## Ответ 3 -## Задание 4(необязательное) +SELECT Жанры.Название AS Жанр, COUNT(*) AS Количество_исполнителей +FROM Жанры +LEFT JOIN Исполнители ON Жанры.Идентификатор = Исполнители.Идентификатор_жанра +GROUP BY Жанры.Название; -Написать SELECT-запросы, которые выведут информацию согласно инструкциям ниже. +SELECT COUNT(*) AS Количество_треков +FROM Треки +JOIN Альбомы ON Треки.Идентификатор_альбома = Альбомы.Идентификатор +WHERE Альбомы.Год_выпуска BETWEEN 2019 AND 2020; -Внимание: результаты запросов не должны быть пустыми, при необходимости добавьте данные в таблицы. +SELECT Альбомы.Название AS Название_альбома, AVG(Треки.Продолжительность) AS Средняя_продолжительность +FROM Треки +JOIN Альбомы ON Треки.Идентификатор_альбома = Альбомы.Идентификатор +GROUP BY Альбомы.Название; + +SELECT Исполнители.Имя +FROM Исполнители +LEFT JOIN Альбомы ON Исполнители.Идентификатор = Альбомы.Идентификатор_исполнителя +WHERE YEAR(Альбомы.Год_выпуска) <> 2020 OR Альбомы.Год_выпуска IS NULL; + +SELECT Сборники.Название +FROM Сборники +JOIN Сборники_Треки ON Сборники.Идентификатор = Сборники_Треки.Идентификатор_сборника +JOIN Треки ON Сборники_Треки.Идентификатор_трека = Треки.Идентификатор +WHERE Треки.Идентификатор_исполнителя = 1; -1. Названия альбомов, в которых присутствуют исполнители более чем одного жанра. -2. Наименования треков, которые не входят в сборники. -3. Исполнитель или исполнители, написавшие самый короткий по продолжительности трек, — теоретически таких треков может быть несколько. -4. Названия альбомов, содержащих наименьшее количество треков. ---