SQLAlchemy: How to create tables with classes - Mapped + mapped_column #5
Vložit
- čas přidán 2. 06. 2024
- Сегодня создадим модель в декларативном стиле, а также добавим типизацию ко всем столбцам.
Освой backend разработку на Python с НУЛЯ до выхода в продакшн за 3 месяца: clck.ru/35mSun
🚨 Продажи открыты только до 31 мая 2024 года! 🚨
Прочитать отзывы к курсу можно на Stepik: clck.ru/38ZdhZ
Все вопросы по SQLAlchemy обсуждаем в телеграм сообществе: t.me/python_community_rus
Мой телеграм канал о жизни разработчика: t.me/artemshumeiko
Полезные материалы для бэкендера в моем телеграм боте: t.me/ArtemShumeikoBot?start=eXQ
Репозиторий на Github с кодом из видео: t.me/artemshumeiko/28
Поддержать меня и получить ранний доступ к видео можно здесь: boosty.to/artemshumeiko
0:00 - Создание связанной с работником таблицы резюме
12:03 - Создание переиспользуемых типов столбцов (крутая фишка)
Освой backend разработку на FastAPI с НУЛЯ до выхода в продакшн за 3 месяца: clck.ru/35mSun
*🚨 Продажи открыты только до 31 мая 2024 года! 🚨*
Прочитать отзывы к курсу можно на Stepik: clck.ru/38ZdhZ
Пишу про лайфхаки при поиске работы, рынок труда и способы развития разработчиков в TG канале - подписывайся: t.me/artemshumeiko
Вступай в Python-сообщество (здесь можно задать любой вопрос): t.me/python_community_rus
Спасибо за Ваш труд...
Спасибо за уроки! Про переиспользуемые типы интересно, не встречал на продакшне, но ждал когда вы скажете что id, created_at, updated_at можно вынести в Base и не дублировать в дочерних классах :)
А как вообще лучше делать? например можно в модели сделать ограничение длины строки с помощью String, но также можно при входных данных например через Field тоже сделать ограничение.
Есть какие то изменения или дополнения по __abstract__
Сделай пожалуйста урок по деревьям в sqlalchemy
Артем, а что по поводу миграций? Будет ли освещено как делать миграции при построении таблиц базы с помощью классов и Mapped?
да, Alembic будет в последнем видео #13
Спасибо за подробные и понятные уроки! А где ссылочка на триггер для onupdate?
Да @artemshumeiko поставь, пожалуйста, ссылочку)
тоже не нашла ссылку(((
Итак не все шло так гладко как в уроке и пришлось немного по другому писать чтобы добиться создания таблиц
1. При импорте класса Base с аннотацией из database.py и замене строки в функции создания таблиц на Base.metadata создание таблицы не проходило , были только логи сообщения и не более
РЕШЕНИЕ: Импотр класса Base из models.py - хз но почему то сработало но появились новые ошибки
2. server_default=text('TIMEZONE("utc", NOW())') при определении автозаполнения времени ругался на эту строку , якобы Ошибка говорит о том, что в выражении DEFAULT нельзя ссылаться на столбцы
РЕШЕНИЕ: замена строки server_default=text('TIMEZONE("utc", NOW())') на server_default=text('now()')
В итоге таблицы созданы без ошибок , но осадок непонимания остался
Спасибо Вам за классные видео, но nullable это не ноль, а отсутствие значение (пусто). Начинающие могут не так понять)
Привет, вместо Annotated можно также просто создать классы-миксины, например, CreateUpdateMixin и множественным наследованием миксовать этот класс к моделям, там где это нужно. Ну и для пайдантик схем аналогично. Но фишка с Annotated прикольная) Ещё в дополнение: если юзать Annotated и потом в будущем нужно, например, переименовать поле created_at в что-нибудь другое, например, created_datetime, то придётся переписывать все модели. А если модели наследуются от миксина, то достаточно поменять в одном месте, тем самым мы соблюдаем принцип DRY
Я раньше тоже делал через миксины, но мне оказалось удобнее напрямую указывать типы - всегда перед глазами, когда смотрю на SA или Pydantic модель, а то часто недоумевал, откуда у меня в модели какой-то атрибут взялся. Мб просто не приучил себя смотреть на родительские классы, но пришел к решению писать без миксинов.
Хотя в pydantic юзаю наследование, там без него не выжить :)
С нарушением DRY отчасти согласен, но современные IDE дают за пару кликов переименовать атрибут во всех классах, поэтому, считаю, что можно через Annotated писать
а можете показать пример такого миксина и его использования?
@@sanyakrt8190 class CreateUpdateMixin(Base):
created_at: Mapped[datetime] = ....
updated_at: .....
class User(Base, CreateUpdateMixin):
id: ...
name: ...
по итогу у User будут созданы еще столбцы/атрибуты created_at и updated_at
@@sanyakrt8190, если поле используется во всех классах, то можно его указать прямо в классе Base.
Когда продолжение? Даже на бусти только 5 урок.
За вами постою.
на ютубе через месяц :)
ну бусти через 1-2 недели
Что-то мне кажется, что Артем не хотел выкладывать в паблик 5 уроков =)ы
Всем привет. Может кому пригодится. При работе с БД через SQLite3 или aiosqlite, то много нюансов. При создании таблиц класс Base перенесите в models, иначе PyCharm ругаться будет. Может, конечно, у меня руки не оттуда растут)))
Странно, у меня при запуске пишет только Engine BEGIN, Engine COMMIT и вобще ничего с таблицами не происходит, не удаляются и не создаются, как будто код игнорируется. Echo=True не помог, вобще ничего не пишет что связано с частью СУБД
Такая же фигня. Пингани как будет ответ
@@VladSlon-pt9xx о, я думал я один такой удачник))
Может из за того что на винде?
@@user-oc5sd1jw4n возможно. уже весь код с репой сверил. ума не приложу, что не так
@@VladSlon-pt9xx ждём ответ от автора, может подскажет.
@@user-oc5sd1jw4n дума все дело в замене metadata_obj на Base.metadata в orm
Ребят, вот вы для кого эти курсы делаете? Мало того, что эти бараны-разработчики SQLAlchemy из простой вещи сделали кучу хлама в которой без пузыря не разберешься. Мало того, что у них в разных версиях совсем разные функции делают одно и тоже и весь инет забит хрен пойми какими примерами от школо разработчиков. Так нет, вроде вы проф разработчик, а опять туда же понапихали в один курс и классы, и императив и деклоратив и асинхронность и синхронность. А ведь это по факту 4 разных курса и друг с другом никак не пересекаются.
И это притом, что разные драйвера от разных баз очень так корявенько работают на одних и тех же примерах.
Не правда. Четвертый день в этом разбираюсь. Проще уже на голых запросах можно было код написать. Понаделали сущностей как наркоманы. Я конечно могу к нейронке обратиться. Но и она не может разобраться в этом хламе и дает нерабочий код. А ведь это все вроде должно упрощать жизнь. А тут все наоборот.
так упрощает и типизирует все, а асинх и синх в одном курсе какая разница, если методы одни и те же, да и опыта у разработчиков алхимии явно по-больше чем у вас, в большинстве проектов использование орм оправдано
@@user-rq5gg2uk3s Так эти видео для кого? Для начинающих или профи? Профи это нафиг не надо. Он по этим граблям уже прошли сами и выводы сделали. Я тоже четыре дня помучился добавил в снипеты примеры кода где все работает. А какой смысл в видео тогда, если время приходится терять и разбираться в этом бардаке самостоятельно? Кстати видео устарело, там классы уже другие совсем. А это еще больше бардака добавляет.
всем привет,
может кто-нибудь рассказать, как правильно создавать объекты в таблице, у которых используются поля, созданные с помощью enum?!
я когда через гет запрос к ним обращаюсь, ругается:
fastapi.exceptions.ResponseValidationError: 1 validation errors:
{'type': 'string_type', 'loc': ('response', 'product_category'), 'msg': 'Input should be a valid string', 'input': ,