SQLAlchemy: How to create tables with classes - Mapped + mapped_column #5

Sdílet
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 - Создание переиспользуемых типов столбцов (крутая фишка)

Komentáře • 42

  • @artemshumeiko
    @artemshumeiko  Před 8 měsíci +2

    Освой backend разработку на FastAPI с НУЛЯ до выхода в продакшн за 3 месяца: clck.ru/35mSun
    *🚨 Продажи открыты только до 31 мая 2024 года! 🚨*
    Прочитать отзывы к курсу можно на Stepik: clck.ru/38ZdhZ
    Пишу про лайфхаки при поиске работы, рынок труда и способы развития разработчиков в TG канале - подписывайся: t.me/artemshumeiko
    Вступай в Python-сообщество (здесь можно задать любой вопрос): t.me/python_community_rus

  • @constkk3153
    @constkk3153 Před 2 měsíci

    Спасибо за Ваш труд...

  • @AS-fk5fw
    @AS-fk5fw Před 21 dnem

    Спасибо за уроки! Про переиспользуемые типы интересно, не встречал на продакшне, но ждал когда вы скажете что id, created_at, updated_at можно вынести в Base и не дублировать в дочерних классах :)

  • @xesax
    @xesax Před 2 měsíci +1

    А как вообще лучше делать? например можно в модели сделать ограничение длины строки с помощью String, но также можно при входных данных например через Field тоже сделать ограничение.

  • @user-gd6wv7qf9f
    @user-gd6wv7qf9f Před 7 měsíci

    Есть какие то изменения или дополнения по __abstract__

  • @thatmaks8094
    @thatmaks8094 Před 7 měsíci +2

    Сделай пожалуйста урок по деревьям в sqlalchemy

  • @Pawokify
    @Pawokify Před 6 měsíci

    Артем, а что по поводу миграций? Будет ли освещено как делать миграции при построении таблиц базы с помощью классов и Mapped?

    • @artemshumeiko
      @artemshumeiko  Před 6 měsíci +1

      да, Alembic будет в последнем видео #13

  • @JxSol
    @JxSol Před 7 měsíci +3

    Спасибо за подробные и понятные уроки! А где ссылочка на триггер для onupdate?

    • @wolftool3868
      @wolftool3868 Před 6 měsíci +1

      Да @artemshumeiko поставь, пожалуйста, ссылочку)

    • @user-jf3rv6kh3l
      @user-jf3rv6kh3l Před 2 měsíci

      тоже не нашла ссылку(((

  • @maxmotors9672
    @maxmotors9672 Před 27 dny +1

    Итак не все шло так гладко как в уроке и пришлось немного по другому писать чтобы добиться создания таблиц
    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()')
    В итоге таблицы созданы без ошибок , но осадок непонимания остался

  • @dmitrya6120
    @dmitrya6120 Před 7 měsíci

    Спасибо Вам за классные видео, но nullable это не ноль, а отсутствие значение (пусто). Начинающие могут не так понять)

  • @bezborodovanton
    @bezborodovanton Před 8 měsíci

    Привет, вместо Annotated можно также просто создать классы-миксины, например, CreateUpdateMixin и множественным наследованием миксовать этот класс к моделям, там где это нужно. Ну и для пайдантик схем аналогично. Но фишка с Annotated прикольная) Ещё в дополнение: если юзать Annotated и потом в будущем нужно, например, переименовать поле created_at в что-нибудь другое, например, created_datetime, то придётся переписывать все модели. А если модели наследуются от миксина, то достаточно поменять в одном месте, тем самым мы соблюдаем принцип DRY

    • @artemshumeiko
      @artemshumeiko  Před 8 měsíci +1

      Я раньше тоже делал через миксины, но мне оказалось удобнее напрямую указывать типы - всегда перед глазами, когда смотрю на SA или Pydantic модель, а то часто недоумевал, откуда у меня в модели какой-то атрибут взялся. Мб просто не приучил себя смотреть на родительские классы, но пришел к решению писать без миксинов.
      Хотя в pydantic юзаю наследование, там без него не выжить :)
      С нарушением DRY отчасти согласен, но современные IDE дают за пару кликов переименовать атрибут во всех классах, поэтому, считаю, что можно через Annotated писать

    • @sanyakrt8190
      @sanyakrt8190 Před 6 měsíci

      а можете показать пример такого миксина и его использования?

    • @artemshumeiko
      @artemshumeiko  Před 6 měsíci +1

      ​@@sanyakrt8190 class CreateUpdateMixin(Base):
      created_at: Mapped[datetime] = ....
      updated_at: .....
      class User(Base, CreateUpdateMixin):
      id: ...
      name: ...
      по итогу у User будут созданы еще столбцы/атрибуты created_at и updated_at

    • @xewuss3750
      @xewuss3750 Před 6 měsíci

      @@sanyakrt8190, если поле используется во всех классах, то можно его указать прямо в классе Base.

  • @simpleman4790
    @simpleman4790 Před 8 měsíci +2

    Когда продолжение? Даже на бусти только 5 урок.

    • @antigame99
      @antigame99 Před 8 měsíci

      За вами постою.

    • @artemshumeiko
      @artemshumeiko  Před 8 měsíci +3

      на ютубе через месяц :)
      ну бусти через 1-2 недели

  • @antigame99
    @antigame99 Před 8 měsíci

    Что-то мне кажется, что Артем не хотел выкладывать в паблик 5 уроков =)ы

  • @user-px4cj3ir8i
    @user-px4cj3ir8i Před měsícem

    Всем привет. Может кому пригодится. При работе с БД через SQLite3 или aiosqlite, то много нюансов. При создании таблиц класс Base перенесите в models, иначе PyCharm ругаться будет. Может, конечно, у меня руки не оттуда растут)))

  • @user-oc5sd1jw4n
    @user-oc5sd1jw4n Před 7 měsíci +2

    Странно, у меня при запуске пишет только Engine BEGIN, Engine COMMIT и вобще ничего с таблицами не происходит, не удаляются и не создаются, как будто код игнорируется. Echo=True не помог, вобще ничего не пишет что связано с частью СУБД

    • @VladSlon-pt9xx
      @VladSlon-pt9xx Před 7 měsíci +1

      Такая же фигня. Пингани как будет ответ

    • @user-oc5sd1jw4n
      @user-oc5sd1jw4n Před 7 měsíci

      @@VladSlon-pt9xx о, я думал я один такой удачник))
      Может из за того что на винде?

    • @VladSlon-pt9xx
      @VladSlon-pt9xx Před 7 měsíci

      @@user-oc5sd1jw4n возможно. уже весь код с репой сверил. ума не приложу, что не так

    • @user-oc5sd1jw4n
      @user-oc5sd1jw4n Před 7 měsíci

      @@VladSlon-pt9xx ждём ответ от автора, может подскажет.

    • @VladSlon-pt9xx
      @VladSlon-pt9xx Před 7 měsíci

      @@user-oc5sd1jw4n дума все дело в замене metadata_obj на Base.metadata в orm

  • @user-tm5nm9dp7l
    @user-tm5nm9dp7l Před měsícem

    Ребят, вот вы для кого эти курсы делаете? Мало того, что эти бараны-разработчики SQLAlchemy из простой вещи сделали кучу хлама в которой без пузыря не разберешься. Мало того, что у них в разных версиях совсем разные функции делают одно и тоже и весь инет забит хрен пойми какими примерами от школо разработчиков. Так нет, вроде вы проф разработчик, а опять туда же понапихали в один курс и классы, и императив и деклоратив и асинхронность и синхронность. А ведь это по факту 4 разных курса и друг с другом никак не пересекаются.
    И это притом, что разные драйвера от разных баз очень так корявенько работают на одних и тех же примерах.
    Не правда. Четвертый день в этом разбираюсь. Проще уже на голых запросах можно было код написать. Понаделали сущностей как наркоманы. Я конечно могу к нейронке обратиться. Но и она не может разобраться в этом хламе и дает нерабочий код. А ведь это все вроде должно упрощать жизнь. А тут все наоборот.

    • @user-rq5gg2uk3s
      @user-rq5gg2uk3s Před 28 dny

      так упрощает и типизирует все, а асинх и синх в одном курсе какая разница, если методы одни и те же, да и опыта у разработчиков алхимии явно по-больше чем у вас, в большинстве проектов использование орм оправдано

    • @user-tm5nm9dp7l
      @user-tm5nm9dp7l Před 25 dny

      @@user-rq5gg2uk3s Так эти видео для кого? Для начинающих или профи? Профи это нафиг не надо. Он по этим граблям уже прошли сами и выводы сделали. Я тоже четыре дня помучился добавил в снипеты примеры кода где все работает. А какой смысл в видео тогда, если время приходится терять и разбираться в этом бардаке самостоятельно? Кстати видео устарело, там классы уже другие совсем. А это еще больше бардака добавляет.

  • @user-xh3hz5iv6j
    @user-xh3hz5iv6j Před 7 měsíci

    всем привет,
    может кто-нибудь рассказать, как правильно создавать объекты в таблице, у которых используются поля, созданные с помощью enum?!
    я когда через гет запрос к ним обращаюсь, ругается:
    fastapi.exceptions.ResponseValidationError: 1 validation errors:
    {'type': 'string_type', 'loc': ('response', 'product_category'), 'msg': 'Input should be a valid string', 'input': ,