SQLAlchemy: Intro to relationships and ORM #9

Sdílet
Vložit
  • čas přidán 1. 06. 2024
  • Сегодня рассмотрим relationships в Алхимии. Маст хэв для каждого алхимика.
    Освой 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 - Добавляем relationship к моделям
    4:08 - Пишем запрос с использованием relationship (options). Ленивая загрузка (lazy load)
    6:01 - Проблема N + 1
    7:55 - joinedload
    10:40 - selectinload
    13:41 - Красивые модели в логах (метод __repr__)

Komentáře • 31

  • @artemshumeiko
    @artemshumeiko  Před 7 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

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

    Спасибо за видео!

  • @user-rx5rm4jz5j
    @user-rx5rm4jz5j Před 5 měsíci

    Привет. Очень хорошее видео, спасибо. У меня такой вопрос - результат выводится в качестве списка, каждый элемент которого находится в круглых скобках, то есть отдельные строки отделены друг от друга. Как сделать вывод ез скобок, как в видео? Надеюсь понятно написал)

  • @user-rn3ld8sp4s
    @user-rn3ld8sp4s Před 6 měsíci +1

    Расскажите пожалуйста, как правильно (быстро) вставлять в БД связанные объекты (o2m) через ORM? С небольшим кол-вом проблем нет, а вот запись нескольких тысяч строк занимаем большое кол-во времени

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

    Спасибо за отличный материал.
    Посмотрев курс по алхимии, решил что запишусь к вам на обучение после завершения своего пет проекта))

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

      Спасибо! Впереди еще 4 видео по Алхимии ;)

  • @tur8008
    @tur8008 Před 6 měsíci +2

    Спасибо за отличное видео, с удовольствием посмотрел. Вы сказали что relationship не стоит включать в вывод repr, однако в вашей имплементации метода я не вижу способа исключения таких полей. Как вы это решаете?

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

      цикл for проходится только по колонкам columns. Чтобы итерироваться по relationship'ам, нужен другой атрибут. Поэтому все нормально работает

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

      @@artemshumeiko понял, спасибо!

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

    эх, надеялся что будет обьяснение как иерархично подгружать обьекты которые имеют ссылки сами на себя (например как комментарии в реддит)

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

    А как связать двух юзеров одной таблицы? Скажем, мне надо учеников рассадить парами..
    Ну чтобы в таблице был такой столбец у каждого ученика, ссылающийся на другого ученика..

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

    Привет! Очень годный контент. Заметил, что все модели пишешь в одном файле, а не разбиваешь. А как можно избежать круговой зависимости при создании Many To Many relationship, если каждая моделька выносится в отдельный файл?

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

      просто в кавычках указывать название модели внутри, вот так: Mapped["ModelName"]. Алхимия сама доимпортирует все при старте приложения

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

      @@artemshumeiko пробовал так делать, но она жалуется, сам не до конца понимаю почему. даже vscode в таком формате не видит ссылку на класс :(

  • @misterbobrust
    @misterbobrust Před 3 měsíci

    Привет, а если у меня несколько таблиц которые нужно подгрузить с помощью selectinload или joinedload? Я видел способ, там нужно каждый раз указывать options и в нём каждый раз по одному selectinload, мне кажется это неудобно

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

      можно изначально для relationship указать вид подгрузки, например, lazy="selectin", но так не рекомендуется делать, потому что в одном месте кода вам нужна будет selectin подгрузка, а в другом - нет, но она будет срабатывать и тормозить исполнение кода
      обычно подгрузки явно указываются через options

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

    я может ошибаюсь, но one2many и many2one это же одно и то же? Типа есть автор, у него есть много книг - one2many. Точно также у многих книг может быть только 1 автор - many2one, от формулировки смысл то тот же

  • @user-oc5sd1jw4n
    @user-oc5sd1jw4n Před 6 měsíci +1

    А когда будет про то как результат ответа от БД конвертировать в Pydantic модель ?

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

      ручками, лист компрехеншен в помощь

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

      В pydantic модели нужно и определить
      class Config:
      orm_mode=True
      Затем Model. from_orm(sql_alchemy_model)

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

      11 видео будет полностью посвящено этому
      выйдет через 2 недели

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

      @@artemshumeikoотлично! очень ждём

  • @hovharoyan3262
    @hovharoyan3262 Před 3 měsíci

    Спасибо за урок.Поясните пожалуйста RELATIONSHIP это как related_name в django orm?

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

      не совсем
      related_name в Джанго -- это просто название связи, а сама связь задается через models.ForeignKey или models.ManyToManyField.
      В Алхимии связь всегда задается через relationship(), а тип связи (m2o, o2o, m2m) определяется через тип внутри конструкции Mapped[...]

    • @hovharoyan3262
      @hovharoyan3262 Před 3 měsíci

      спасибо

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

    А какая разница между join и joinedload

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

      Join вернет плоскую табличную структуру с N + M колонками (где N - кол-во столбцов первой таблицы, M - второй)
      Joinedload выполнит по сути тот же самый SQL запрос, но после получения данных, Алхимия приведет его к вложенной структуре, где каждый элемент будет иметь N атрибутов (исходных столбцов) + 1 relationship, внутри которого будет данные второй таблицы
      Надеюсь, понятно объяснил

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

      @@artemshumeiko то есть, use case для join, в рамках алхимии, это когда нужно, например, пофилтровать по связанной таблице?
      Например, получить воркеров с полем workload=fulltime из таблицы резюме?

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

    Расставил breakpoints как у тебя, но дебаггер тупо их проскакивает, не могу понять в чем дело.

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

    selectinload очень похож на джанговский prefetch_related