SQLAlchemy: SELECT and UPDATE queries with ORM vs CORE #6
Vložit
- čas přidán 2. 06. 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
Освой backend разработку на FastAPI с НУЛЯ до выхода в продакшн за 3 месяца: clck.ru/35mSun
*🚨 Продажи открыты только до 31 мая 2024 года! 🚨*
Прочитать отзывы к курсу можно на Stepik: clck.ru/38ZdhZ
Пишу про лайфхаки при поиске работы, рынок труда и способы развития разработчиков в TG канале - подписывайся: t.me/artemshumeiko
Вступай в Python-сообщество (здесь можно задать любой вопрос): t.me/python_community_rus
Поправь порядок видосов в плейлисте
спасибо
@@coryphoenixxx8238
Такое впечатление, что тут пропущен видос.
Про scalars не было вообще ничего, а тут "напомню".
И именно объяснение этой штуки меня очень интересовало.
Да и Core VS ORM тоже не было...
Очень доступное объяснение. Талант к преподаванию!
Супер! Очень интересно и с нетерпением ждем новых!
видно, что постарался над курсом. Помню, летом 2023 смотрел твои видео по фастапи и они мне сильно не понравились. В этом же курсе чувствуется опыт и работа. Однозначно лайк
Согласен, в том курсе прям постоянно код менялся, четкой структуры как будто не было, здесь эти ошибки исправлены, а может быть я сам уже "дорос". Тоже с удовольствием прохожу этот курс
Отличные видео, продолжай в том же духе!
Спасибо за урок👍. Отлично объясняешь 🤩. С нетерпением жду тему relationship💪
Спасибо) на следующей неделе уже выйдет первое видео по relationships
Спасибо, всё подробно обьяснил !
ВОПРОС - а не сброится ли наш primary_key если мы применим метод refresh перед коммитом в функции обновления воркера?
и получится так что апдейт будет искать ключи которых не существует..
Артем, привет!
Большое спасибо за курс!
Подскажи, пожалуйста, как определить, что лучше для проекта выбрать: SQLAlchemy Core или SQLAlchemy ORM? Что является более ограниченным по возможностям и может у тебя есть какие-нибудь ресурсы, где можно почитать про выбор кора или орм? Заранее спасибо!
на 9:08 можно в where указывать TableName.column, а не TableName.c.column, по крайней мере в sqlalchemy version >2.0. Мне такой синтаксис больше нравится, так как работает автодополнение и есть подсветка
Если имеем дело с таблицами Table(...), то обязаны указывать .c. Если задаем модель через класс, то да, .c не нужен и есть подсказки в IDE
Выборка через where всегда требует .c. указывать? В документации не нашел конкретно про "c"
Кажется что "c" необходим для таблицы созданных через Table, а таблицы через Classname(Base) позволяет к полю id обращаться как к атрибуту модели.
.с нужен только для table, для cte и subquery
вроде я упоминаю это в курсе
Хочу обратить внимание, что согласно документации one_or_none() может возбудить ошибку при возврате более одной строки - MultipleResultError (с названием могу путать);
Сделай пожалуйста следующее:
Есть допустим таблица User, у него email и username, оба unique=True, вопрос, при добавлении User, если вылетел exception UniqueConstraintFailed, как нам в алхимии понять какое именно поле не прошло проверку на уникальность
Мб проверь есть ли юзер по емейлу потом по юзернейму
@@emerald2281 каждый раз 2 лишних запроса писать?
Курс очень нравится, но я не совсем понимаю, если мы используем ORM, то работаем через sessionmaker, а если с Core, то через engine? Или это просто совпадение? Ведь работает и так, и так. В чем отличие и как понять, что использовать? Заранее спасибо)
в ORM обязательно использовать сессию, именно она собирает в себя все изменения и при коммите разом отправляет их в базу данных. engine просто исполняет запросы и не способен держать контекст
я говорю про session.add(), session.add_all() и, например,
user = session.get(User, 1)
user.name = "Ivan"
session.commit()
А как в алхимии решается проблема N+1?
Покажу в видео о relationship. Они будут под номерами 9,10
привет! я новичок в sqlalchemy да и вообще в питоне, столкнулся с проблемой циклических импортов когда попытался связать 2 модели, есть модель User, есть модель UserRole, в User есть поле roles: Mapped[List[UserRole]], а в UserRole поле user: Mapped[User]. Ну и импортировав необходимые классы получил ошибку. Как вообще грамотно с таким бороться?
достаточно название модели заключить в кавычки: Mapped[List["UserRole"]] и убрать явные импорты -- алхимия дальше разберется :)
ровно так же кстати работают импорты моделей в Pydantic, если встретитесь