SQLAlchemy: SELECT and UPDATE queries with ORM vs CORE #6

Поділитися
Вставка
  • Опубліковано 1 чер 2024
  • Сегодня научимся избегать SQL инъекций при использовании SQLAlchemy Core, напишем запросы, используя ORM и разберемся, что такое session.flush(), session.refresh() и session.expire()
    Освой 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 - Select запрос через Core
    4:09 - Защищаемся от SQL инъекций
    7:54 - Update запрос через функцию update()
    12:14 - Select через ORM
    16:04 - Обновление моделей через ORM
    18:33 - flush
    22:17 - expire
    25:05 - refresh

КОМЕНТАРІ • 28

  • @artemshumeiko
    @artemshumeiko  8 місяців тому +3

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

    • @coryphoenixxx8238
      @coryphoenixxx8238 6 місяців тому

      Поправь порядок видосов в плейлисте

    • @artemshumeiko
      @artemshumeiko  6 місяців тому +1

      спасибо
      @@coryphoenixxx8238

  • @7IdE
    @7IdE 5 місяців тому +3

    Такое впечатление, что тут пропущен видос.
    Про scalars не было вообще ничего, а тут "напомню".
    И именно объяснение этой штуки меня очень интересовало.
    Да и Core VS ORM тоже не было...

  • @asg5511
    @asg5511 7 місяців тому +5

    Очень доступное объяснение. Талант к преподаванию!

  • @user-zh4ri8op1x
    @user-zh4ri8op1x 7 місяців тому +1

    Супер! Очень интересно и с нетерпением ждем новых!

  • @hunterxvov4ik
    @hunterxvov4ik 3 місяці тому +1

    видно, что постарался над курсом. Помню, летом 2023 смотрел твои видео по фастапи и они мне сильно не понравились. В этом же курсе чувствуется опыт и работа. Однозначно лайк

    • @dima5116
      @dima5116 Місяць тому

      Согласен, в том курсе прям постоянно код менялся, четкой структуры как будто не было, здесь эти ошибки исправлены, а может быть я сам уже "дорос". Тоже с удовольствием прохожу этот курс

  • @emerald2281
    @emerald2281 7 місяців тому +1

    Отличные видео, продолжай в том же духе!

  • @user-oc2jv2mt9k
    @user-oc2jv2mt9k 6 місяців тому +1

    Спасибо за урок👍. Отлично объясняешь 🤩. С нетерпением жду тему relationship💪

    • @artemshumeiko
      @artemshumeiko  6 місяців тому +1

      Спасибо) на следующей неделе уже выйдет первое видео по relationships

  • @user-oc5sd1jw4n
    @user-oc5sd1jw4n 7 місяців тому

    Спасибо, всё подробно обьяснил !
    ВОПРОС - а не сброится ли наш primary_key если мы применим метод refresh перед коммитом в функции обновления воркера?
    и получится так что апдейт будет искать ключи которых не существует..

  • @scr1pt651
    @scr1pt651 5 місяців тому

    Артем, привет!
    Большое спасибо за курс!
    Подскажи, пожалуйста, как определить, что лучше для проекта выбрать: SQLAlchemy Core или SQLAlchemy ORM? Что является более ограниченным по возможностям и может у тебя есть какие-нибудь ресурсы, где можно почитать про выбор кора или орм? Заранее спасибо!

  • @user-jq5rs8hx8j
    @user-jq5rs8hx8j 7 місяців тому +2

    на 9:08 можно в where указывать TableName.column, а не TableName.c.column, по крайней мере в sqlalchemy version >2.0. Мне такой синтаксис больше нравится, так как работает автодополнение и есть подсветка

    • @artemshumeiko
      @artemshumeiko  7 місяців тому +1

      Если имеем дело с таблицами Table(...), то обязаны указывать .c. Если задаем модель через класс, то да, .c не нужен и есть подсказки в IDE

  • @Qustoos
    @Qustoos 5 місяців тому

    Выборка через where всегда требует .c. указывать? В документации не нашел конкретно про "c"
    Кажется что "c" необходим для таблицы созданных через Table, а таблицы через Classname(Base) позволяет к полю id обращаться как к атрибуту модели.

    • @artemshumeiko
      @artemshumeiko  5 місяців тому

      .с нужен только для table, для cte и subquery
      вроде я упоминаю это в курсе

  • @xacho86
    @xacho86 7 місяців тому

    Хочу обратить внимание, что согласно документации one_or_none() может возбудить ошибку при возврате более одной строки - MultipleResultError (с названием могу путать);

  • @Biongar
    @Biongar 7 місяців тому

    Сделай пожалуйста следующее:
    Есть допустим таблица User, у него email и username, оба unique=True, вопрос, при добавлении User, если вылетел exception UniqueConstraintFailed, как нам в алхимии понять какое именно поле не прошло проверку на уникальность

    • @emerald2281
      @emerald2281 7 місяців тому

      Мб проверь есть ли юзер по емейлу потом по юзернейму

    • @Biongar
      @Biongar 7 місяців тому

      @@emerald2281 каждый раз 2 лишних запроса писать?

  • @vasiliy2396
    @vasiliy2396 3 місяці тому

    Курс очень нравится, но я не совсем понимаю, если мы используем ORM, то работаем через sessionmaker, а если с Core, то через engine? Или это просто совпадение? Ведь работает и так, и так. В чем отличие и как понять, что использовать? Заранее спасибо)

    • @artemshumeiko
      @artemshumeiko  3 місяці тому +1

      в ORM обязательно использовать сессию, именно она собирает в себя все изменения и при коммите разом отправляет их в базу данных. engine просто исполняет запросы и не способен держать контекст
      я говорю про session.add(), session.add_all() и, например,
      user = session.get(User, 1)
      user.name = "Ivan"
      session.commit()

  • @nateriver8261
    @nateriver8261 7 місяців тому

    А как в алхимии решается проблема N+1?

    • @artemshumeiko
      @artemshumeiko  7 місяців тому +3

      Покажу в видео о relationship. Они будут под номерами 9,10

  • @natpagle2628
    @natpagle2628 6 місяців тому +1

    привет! я новичок в sqlalchemy да и вообще в питоне, столкнулся с проблемой циклических импортов когда попытался связать 2 модели, есть модель User, есть модель UserRole, в User есть поле roles: Mapped[List[UserRole]], а в UserRole поле user: Mapped[User]. Ну и импортировав необходимые классы получил ошибку. Как вообще грамотно с таким бороться?

    • @artemshumeiko
      @artemshumeiko  6 місяців тому +3

      достаточно название модели заключить в кавычки: Mapped[List["UserRole"]] и убрать явные импорты -- алхимия дальше разберется :)

    • @artemshumeiko
      @artemshumeiko  6 місяців тому +3

      ровно так же кстати работают импорты моделей в Pydantic, если встретитесь