Українська
Завдання
Відповідно до номера свого варіанта виконайте завдання обраного рівня складності.
Основна СКБД – SQLite. Початковий рівень використовує sqlite3; базовий додає зв’язки й звіти; високий реалізує предметний доступ через SQLAlchemy 2.0 і обов’язкові тести pytest. Alembic є додатковим дослідженням, а не заміною обов’язкових вимог. Шлях до окремого навчального файла бази передавайте аргументом. Меню має додавати, показувати, змінювати й видаляти записи за ідентифікатором із підтвердженим результатом операції. Для деструктивних дій використовуйте тільки базу цієї лабораторної. Грошові суми зберігайте цілими копійками, дати – у перевіреному ISO-форматі. Особові дані вигадані. Усі функції мають анотації.
Варіанти
Варіант 1. Бібліотека
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею books(id,title). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою books(id,title); readers(id,name); loans(id,book_id,reader_id,due,returned). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: відкриті позики з due раніше дати ISO, переданої аргументом; returned є 0 або 1. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою books(id,title); readers(id,name); loans(id,book_id,reader_id,due,returned). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: відкриті позики з due раніше дати ISO, переданої аргументом; returned є 0 або 1. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 2. Магазин
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею products(id,name,cents). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою products(id,name,cents); customers(id,name); sales(id,product_id,customer_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: виручку за товаром як суму quantity*cents; quantity додатна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою products(id,name,cents); customers(id,name); sales(id,product_id,customer_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: виручку за товаром як суму quantity*cents; quantity додатна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 3. Поліклініка
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею doctors(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою doctors(id,name); patients(id,name); visits(id,doctor_id,patient_id,start). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: прийоми лікаря на задану ISO-дату; start ISO-дата й час, повтор doctor_id/start заборонений; лише вигадані дані. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою doctors(id,name); patients(id,name); visits(id,doctor_id,patient_id,start). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: прийоми лікаря на задану ISO-дату; start ISO-дата й час, повтор doctor_id/start заборонений; лише вигадані дані. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 4. Автосервіс
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею cars(id,plate). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою cars(id,plate); services(id,name,cents); repairs(id,car_id,service_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вартість ремонтів кожного авто як суму quantity*cents. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою cars(id,plate); services(id,name,cents); repairs(id,car_id,service_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вартість ремонтів кожного авто як суму quantity*cents. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 5. Футбольна ліга
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею teams(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою teams(id,name); matches(id,home_id,away_id,home_goals,away_goals). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: очки команд: 3 за перемогу, 1 за нічию, 0 за поразку; два FK на teams, команди матчу різні, голи невід’ємні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою teams(id,name); matches(id,home_id,away_id,home_goals,away_goals). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: очки команд: 3 за перемогу, 1 за нічию, 0 за поразку; два FK на teams, команди матчу різні, голи невід’ємні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 6. Готель
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею rooms(id,number). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою rooms(id,number); guests(id,name); bookings(id,room_id,guest_id,start,end). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вільні номери для інтервалу [start,end), дати ISO, start<end; перетин бронювань номера відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою rooms(id,number); guests(id,name); bookings(id,room_id,guest_id,start,end). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вільні номери для інтервалу [start,end), дати ISO, start<end; перетин бронювань номера відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 7. Деканат
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею students(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою students(id,name); courses(id,title); grades(student_id,course_id,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середні бали студентів; score цілий 0..100, пара student_id/course_id унікальна, студент без оцінок має NULL. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою students(id,name); courses(id,title); grades(student_id,course_id,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середні бали студентів; score цілий 0..100, пара student_id/course_id унікальна, студент без оцінок має NULL. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 8. Склад
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею products(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою products(id,name); movements(id,product_id,delta). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: залишок кожного товару як суму delta зі знаками; початково 0, операцію з від’ємним підсумком відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою products(id,name); movements(id,product_id,delta). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: залишок кожного товару як суму delta зі знаками; початково 0, операцію з від’ємним підсумком відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 9. Кінотеатр
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею movies(id,title). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою movies(id,title); sessions(id,movie_id,capacity); tickets(id,session_id,seat). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число проданих місць і вільний залишок сеансу; capacity додатна, seat у межах, пара session_id/seat унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою movies(id,title); sessions(id,movie_id,capacity); tickets(id,session_id,seat). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число проданих місць і вільний залишок сеансу; capacity додатна, seat у межах, пара session_id/seat унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 10. Туристична агенція
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею tours(id,title,cents). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою tours(id,title,cents); clients(id,name); purchases(id,tour_id,client_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість проданих місць і виручку за туром. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою tours(id,title,cents); clients(id,name); purchases(id,tour_id,client_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість проданих місць і виручку за туром. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 11. Кулінарна книга
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею dishes(id,title). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою dishes(id,title); ingredients(id,name); recipe(dish_id,ingredient_id,grams). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: страви із заданим інгредієнтом; grams додатна, пара ключів у recipe унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою dishes(id,title); ingredients(id,name); recipe(dish_id,ingredient_id,grams). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: страви із заданим інгредієнтом; grams додатна, пара ключів у recipe унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 12. Служба таксі
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею drivers(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою drivers(id,name); rides(id,driver_id,date,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість поїздок і виручку водіїв за задану дату ISO. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою drivers(id,name); rides(id,driver_id,date,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість поїздок і виручку водіїв за задану дату ISO. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 13. Ветклініка
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею owners(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою owners(id,name); pets(id,owner_id,name); visits(id,pet_id,due). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: візити з due до заданої дати ISO; лише вигадані записи без медичних порад. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою owners(id,name); pets(id,owner_id,name); visits(id,pet_id,due). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: візити з due до заданої дати ISO; лише вигадані записи без медичних порад. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 14. Прокат обладнання
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею equipment(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою equipment(id,name); clients(id,name); rentals(id,equipment_id,client_id,due,returned). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: неповернені оренди із простроченим due; returned 0 або 1. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою equipment(id,name); clients(id,name); rentals(id,equipment_id,client_id,due,returned). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: неповернені оренди із простроченим due; returned 0 або 1. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 15. Музичний сервіс
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею artists(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою artists(id,name); albums(id,artist_id,title); plays(id,album_id,date). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число прослуховувань альбомів за заданий місяць YYYY-MM. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою artists(id,name); albums(id,artist_id,title); plays(id,album_id,date). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число прослуховувань альбомів за заданий місяць YYYY-MM. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 16. Домашня бухгалтерія
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею categories(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою categories(id,name); operations(id,category_id,date,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму знакових копійок за категоріями й місяцем YYYY-MM. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою categories(id,name); operations(id,category_id,date,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму знакових копійок за категоріями й місяцем YYYY-MM. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 17. Шкільна їдальня
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею dishes(id,name,cents). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою dishes(id,name,cents); pupils(id,name); orders(id,dish_id,pupil_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вартість замовлень за учнем; quantity додатна, ціни навчальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою dishes(id,name,cents); pupils(id,name); orders(id,dish_id,pupil_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: вартість замовлень за учнем; quantity додатна, ціни навчальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 18. Наукова конференція
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею sections(id,title). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою sections(id,title); speakers(id,name); talks(id,section_id,speaker_id,start,end). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: розклад секції, start/end цілі хвилини 0..1440, start<end; перетини однієї секції відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою sections(id,title); speakers(id,name); talks(id,section_id,speaker_id,start,end). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: розклад секції, start/end цілі хвилини 0..1440, start<end; перетини однієї секції відхиляти. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 19. Фітнес-клуб
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею trainers(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою trainers(id,name); clients(id,name); attendance(id,trainer_id,client_id,date). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість відвідувань за тренером за заданий місяць. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою trainers(id,name); clients(id,name); attendance(id,trainer_id,client_id,date). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: кількість відвідувань за тренером за заданий місяць. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 20. Відділ кадрів
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею departments(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою departments(id,name); employees(id,department_id,name,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: фонд навчальної місячної зарплати за відділом; cents невід’ємні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою departments(id,name); employees(id,department_id,name,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: фонд навчальної місячної зарплати за відділом; cents невід’ємні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 21. Аптечний облік
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею suppliers(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою suppliers(id,name); products(id,supplier_id,name,expires); sales(id,product_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: товари з expires раніше заданої дати ISO та кількість продажів; вигадані назви, без дозувань. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою suppliers(id,name); products(id,supplier_id,name,expires); sales(id,product_id,quantity). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: товари з expires раніше заданої дати ISO та кількість продажів; вигадані назви, без дозувань. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 22. Агенція нерухомості
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею agents(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою agents(id,name); properties(id,address); deals(id,agent_id,property_id,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму угод агента й комісію 2 відсотки, округлену вниз до копійки; одна угода на об’єкт. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою agents(id,name); properties(id,address); deals(id,agent_id,property_id,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму угод агента й комісію 2 відсотки, округлену вниз до копійки; одна угода на об’єкт. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 23. Логістика
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею warehouses(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою warehouses(id,name); shipments(id,warehouse_id,due,delivered). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: доставлені із запізненням відправлення, delivered може бути NULL; дати ISO. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою warehouses(id,name); shipments(id,warehouse_id,due,delivered). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: доставлені із запізненням відправлення, delivered може бути NULL; дати ISO. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 24. Благодійний фонд
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею campaigns(id,title,target_cents). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою campaigns(id,title,target_cents); donors(id,name); donations(id,campaign_id,donor_id,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму й відсоток збору за кампанією; target_cents додатні, внесок додатний. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою campaigns(id,title,target_cents); donors(id,name); donations(id,campaign_id,donor_id,cents). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: суму й відсоток збору за кампанією; target_cents додатні, внесок додатний. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 25. Настільні ігри
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею games(id,title). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою games(id,title); genres(id,name); game_genres(game_id,genre_id); ratings(id,game_id,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середній рейтинг ігор заданого жанру, score 0..10; зв’язки жанрів унікальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою games(id,title); genres(id,name); game_genres(game_id,genre_id); ratings(id,game_id,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середній рейтинг ігор заданого жанру, score 0..10; зв’язки жанрів унікальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 26. Метеоспостереження
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею stations(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою stations(id,name); readings(id,station_id,date,temp). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середню скінченну температуру за станціями та місяцем; temp від -100 до 100. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою stations(id,name); readings(id,station_id,date,temp). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середню скінченну температуру за станціями та місяцем; temp від -100 до 100. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 27. Залізниця
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею stations(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою stations(id,name); trips(id,name); stops(trip_id,station_id,position). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: рейси з заданої станції A до B, де position(A)<position(B); позиції й станції у межах рейсу унікальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою stations(id,name); trips(id,name); stops(trip_id,station_id,position). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: рейси з заданої станції A до B, де position(A)<position(B); позиції й станції у межах рейсу унікальні. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 28. Служба підтримки
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею users(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою users(id,name); tickets(id,user_id,status); comments(id,ticket_id,text). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число заявок за статусом new, active, done та число коментарів кожної заявки. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою users(id,name); tickets(id,user_id,status); comments(id,ticket_id,text). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: число заявок за статусом new, active, done та число коментарів кожної заявки. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 29. Фермерське господарство
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею fields(id,name,hectares). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою fields(id,name,hectares); crops(id,name); harvests(id,field_id,crop_id,year,kg). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: врожайність kg/hectares за полем і роком; hectares додатні, kg невід’ємні, рік 2000..2100. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою fields(id,name,hectares); crops(id,name); harvests(id,field_id,crop_id,year,kg). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: врожайність kg/hectares за полем і роком; hectares додатні, kg невід’ємні, рік 2000..2100. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Варіант 30. Виставка котів
1. Початковий рівень. Створити консольний застосунок sqlite3 із таблицею breeds(id,name). Шлях SQLite-файла передавати аргументом, записи вводити через меню. Реалізувати додавання, читання за id, зміну й видалення; id є INTEGER PRIMARY KEY, текстові назви непорожні, суми невід’ємні цілі копійки, дати ISO, інші числові поля невід’ємні. Вивести впорядкований за id список і повідомлення про відмову. Використати параметри, анотовані функції та явні commit/rollback.
2. Базовий рівень. Створити консольний застосунок для SQLite зі схемою breeds(id,name); cats(id,breed_id,name); scores(id,cat_id,judge,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середній бал і переможців породи з усіма нічиїми; score 0..100, пара cat_id/judge унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Використати sqlite3, увімкнути зовнішні ключі до транзакції, параметризовані запити й один JOIN з агрегатом або підзапитом. Пов’язаний пакет змін виконати атомарно й довести відкат при помилці.
3. Високий рівень. Створити консольний застосунок для SQLite зі схемою breeds(id,name); cats(id,breed_id,name); scores(id,cat_id,judge,score). id є PK, поля з суфіксом _id є FK до відповідної сутності; ключі зв’язків без id складені. Шлях бази передавати аргументом, початкові записи вводити через меню. Реалізувати CRUD та звіт: середній бал і переможців породи з усіма нічиїми; score 0..100, пара cat_id/judge унікальна. Текстові назви непорожні, суми цілі копійки; задати NOT NULL, CHECK і потрібні UNIQUE. Вивести детальний звіт зі стабільним сортуванням. Реалізувати доступ через SQLAlchemy 2.0: DeclarativeBase, Mapped, relationship та select; сесія й транзакція мають явного власника, зв’язки для звіту завантажити без зайвого N+1. Обов’язкові pytest на окремій базі для успіху, дубля, неправильного FK/межі та rollback пакета. Показати SQL звіту й перевірити відповідність результату ручному обчисленню.
Порядок виконання та захисту роботи
- Намалюйте схему таблиць із PK, FK, унікальністю й обмеженнями. Визначте політику видалення батьківських рядків.
- Створіть нову навчальну базу. Перевірте, що зовнішні ключі справді ввімкнені; покажіть схему в CLI або DataGrip.
- Реалізуйте параметризовані операції й звіт. Для SQLAlchemy використовуйте стиль 2.0, явний власник транзакції та сесію.
- Продемонструйте успішну зміну, неправильний FK, дубль ключа, відмову CHECK і rollback пакета. Перевірте незмінність стану.
- Для високого рівня запустіть pytest із новою базою на тест; покажіть запити зв’язків і відсутність зайвого N+1 для звіту.
- Подайте локальний Git-репозиторій: код, README, схема, тестові дані й залежності. Робочу базу з приватними даними не додавайте. На захисті поясніть SQL одного ORM-запиту та межу транзакції.