Продолжаем изучение SQLAlchemy, первая (#1) часть:
После первой части код был немного переработан. Создана отдельная директория (queries), которая будет отвечать за отправку запросов к базе данных. Структура приложения получилась примерно такая:
Все запросы к базе данных перекочевали в файл core.py, который располагается в директории queries:
Ну и при запуске файла main.py будут вызваны функции создания таблицы, наполнения ее данными и выборкой всех данных из этой таблицы:
Открыл базу данных в DBEaver, есть некие отличия от SQLite, непривычно немного но освоиться возможно.
Но писать запросы с помощью текстовых запросов SQL это не наш метод, ведь мы изучаем ORM, так что попробуем вставить еще что-то в БД с помощью ORM:
Запускаем скрипт (вызов функции по удалению и потом созданию таблицы я закомментировал), и вот наши два username добавлены в базу данных:
Ну вот, всё чудненько сработало. Можно продолжать изучение SQLAlchemy.
Далее рассмотрим как всё это работает в декларативном стиле, через объявление классов. Код снова существенно изменится.
Сейчас мы будем работать через "сессию". Сессия нужна для выполнения каких либо запросов к базе данных. Сделали запрос, сделали коммит или роллбэк (отменить какие либо изменения), закрыли сессию.
Затем нужно объявить "базу", наследника от DeclarativeBase. "База" ничего выполнять не будет, просто будет объявлена а затем использована:
Я было подумал, а "нахрена козе баян", я разве не могу напрямую объявить свой собственный класс, который будет непосредственным наследником от DeclarativeBase!? Оказывается - так не работает, без "Base" не работает...
Объявляем класс WorkersORM, который будет наследником от ничего не делающего Base, который в свою очередь наследник от DeclarativeBase. В нем пропишем так же как и ранее два поля id и username, плюс нужно обязательно задать имя таблицы с помощью __tablename__:
Ну вот, осталось воспользоваться данным классом и создать таблицу, заполнить ее данными и считать эти данные:
В main.py меняю импорт функций, на только что написанные, в файле orm.py:
Запускаем и проверяем:
Ну и в завершении, допишу - как будет выглядеть такая же функция в асинхронном исполнении:
И её вызов, с удачным выполнением:
Ну вот, на сегодня - всё. Напоследок - лозунг из моего детства: