Данный курс оказался не без сюрприза. Нельзя было просто так взять и выполнить pip install sqlalchemy и отработать примеры из лекций, ибо в лекциях используется устаревшая версия пакета SQLAlchemy - 1.3.24, а pip install ставит уже принципиально отличающуюся версию - 2.0.
Оказалось что весия 1.3.24 тоже не подходит для лекций, в последнем варианте выдает ошибку. Нужна версия 1.4.15
Так что если хотим повторить код из уроков, то ставим с указанием версии:
И... всё работает:
Но не всё из лекций заработало:
В интернетах пишут что версия должна быть не ниже 1.4.15, попробую обновить...
И пробую снова запустить тот код, который выдал ошибку:
Всё заработало, а про версию модуля SQLAlchemy я вычитал в чате курса:
Придя на работу, на следующий день, я подумал - в первой лекции есть ссылка на документацию по SQLAlchemy, это ссылка на версию пакета 1.4.52:
Так может есть смысл установить именно эту версию?! На рабочем компе как раз еще не устанавливался данный пакет. Установил, запустил скрипт из последней лекции, все работает, но выдает предупреждения о том что данный пакет устаревший:
Вот и думаю, может всё же перейти на версию SQLAlchemy 2.0 и уже под эту версию делать домашнее задание?! Не думаю что там сильные изменения. Полистаю документацию и сделаю.
После pip install --upgrade sqlalchemy (произошло обновление до версии 2.0.29
Возникла ошибка при запуске последнего скрипта, убрал одну строчку из Base и всё снова работает:
Домашнее задание:
Опишите модели в декларативном стиле с помощью ORM. Пока мы не разобрались с зависимостями между таблицами с помощью ForeignKey, связи между таблицами определять не нужно. Author_id, book_id, student_id — обычные атрибуты соответствующих таблиц.
Определите hybrid_property для таблицы ‘receiving_books’ — count_date_with_book (количество дней, которые читатель держит/держал книгу у себя). Подумайте, как определять данный атрибут, если книгу до сих пор не сдали обратно в библиотеку.
Опишите classmethods для таблицы читателей:получить список студентов, которые имеют стипендию;
получить список студентов, у которых средний балл выше, чем тот балл, который будет передан входным параметром в функцию.
Создайте flask-приложение и опишите в нём роуты:получить все книги в библиотеке (GET);
получить список должников, которые держат книги у себя более 14 дней (GET);
выдать книгу студенту (POST — входные параметры ID книги и ID студента);
сдать книгу в библиотеку (POST — входные параметры ID книги и ID студента, если такой связки нет, выдать ошибку).
По желанию, повышенный уровень сложности. Создайте роут, с помощью которого можно найти книгу по названию. На вход передаётся строка, по которой будет выполнен поиск. Поиск должен выдавать книги, в названии которых содержится ключевая строка.
База данных должна состоять из 4х таблиц вот такого содержания:
Данную работу я сделал несколько больше чем требовалось. У меня получилась почти полноценно работающая информационная система для учета выдачи книг, которая работает в браузере:
Итак, начну с описания всех таблиц в декларативном стиле. Все они описаны в отдельном файле models.py. В галерее будет 4 страницы:
Далее реализуем все эндпойнты в отдельном файле routers.py:
Ну и остаются только html-файлы шаблонов, которые используются в render_template(). Опубликую лишь два файла - базовый и индекс:
Если кому нужны остальные файлы, их там не мало, пишите в комменты, какой файл интересует - скину.
Самая сложная часть данной задачи была в понимании гибридного метода. Я кажется до сих пор не сильно понял зачем он нужен и нельзя ли было сделать как то проще подсчет просроченных дней?!