SQLAlchemy: How to JOIN tables | CTE | Subqueries | Window functions #8
Vložit
- čas přidán 2. 06. 2024
- Узнаем, как SQL запросы переносить на язык Алхимии, используем CTE, subquery, aliased и другие функции SQLAlchemy. Это база.
Освой 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 - Пишем SQL запрос
7:53 - Пишем select запрос при помощи Алхимии
Освой backend разработку на FastAPI с НУЛЯ до выхода в продакшн за 3 месяца: clck.ru/35mSun
*🚨 Продажи открыты только до 31 мая 2024 года! 🚨*
Прочитать отзывы к курсу можно на Stepik: clck.ru/38ZdhZ
Пишу про лайфхаки при поиске работы, рынок труда и способы развития разработчиков в TG канале - подписывайся: t.me/artemshumeiko
Вступай в Python-сообщество (здесь можно задать любой вопрос): t.me/python_community_rus
за 2 часа с огромным удовольствием прошёл этот курс 🔥 и пошел смотреть ещё 4 ролика по раннему доступу с подпиской на бусти. я джун с опытом коммерческой разработки менее года и открыл для себя новое. А точнее я сталкивался с этим на работе, но ты круто объяснил, что добавило мне уверенности. спасибо!
Респект автору. Объясняет аки боженька.
спасибо!
Лучший)
Урок топовый!
спасибо!
Очень интересно
Спасибо) стараюсь объяснять сложное простым языком
Артем, добрый день! В одном из видео вы упомянули, что SQLAlchemy может возвращать структуру объекта json, в которой будут отдаваться сгруппированные списки резюме по воркеру. Очень жду эту тему :-)
Про сгруппированные по воркеру будет в следующем видео (9), а про json в 11 видео ;)
Спасибо за урок. Как всегда отличные видео) Не думаешь снять такие же видосы про Redis? Что это такое как с этим работать через питон ну и все такое.
Хорошее предложение) Подумаю
Привет. У меня в VSCode Intellisense гораздо слабее работает. Где можно посмотреть твои настройки VSCode (расширения и тд)?
не понимаю для чего нужен aliased, если можно вместо r = aliased(ResumesOrm) просто написать r = ResumesOrm
мы же в питоне 😀, питон по умолчанию дает такие возможности, хоть по-русски обзови
Хороший курс, кстати алиасы работают для сортировки, только затестил 5:40
спасибо, буду знать
Артём, спасибо за этот курс! Ещё не досмотрел, но пока всё работает))) Задолбался я курить мануалы старые и непонятные, а тут всё понятно)
Может уже спрашивали. Ты чередуешь как здороваешься "Всем привет! Меня зовут Артём" и "Всем привет! Меня зовут Артём Шумейко" - это что за такое интересное?))
Вас понял. Постараюсь определиться с приветствием ;)
@@artemshumeiko А я подумал, что это пасхалка какая или просто шутка)
Можем так делать, нужно так делать, но мы не будем так делать 😂😂😂😂
Здравствуйте, Артем. Мне кажется проще затащить нужные данные и обработать их, используя pandas. Подскажите, пожалуйста, такой подход может быть использован?, Если нет, то почему?
1) pandas медленный. Мы используем SQL, чтобы внутри запроса прописать все нужные фильтры, поля и сортировки. СУБД справляется с этим в разы быстрее
2) pandas не работает с вложенными данными. На фронт или клиенту часто нужно отдать вложенные данные, а pandas именно про работу с табличными данными
3) даже если использовать pandas, SQLAlchemy никуда не уходит, потому что запросы по прежнему нужно как-то писать. И делать это через ORM приятнее и безопаснее, чем через тот же psycopg или любой другой драйвер для написания сырых SQL запросов
А будет курс по RabbitMQ и взаимодействие между микросервисами и тому подобные?
Курс не уверен, но видео точно будет
Привет! Спасибо за контент. Пересмотрел все твои видео по FastAPI и алхимии, очень годно объясняешь)
Интересный вопрос: насколько реально нужны эти костыли и палки? Я смотрел много видео по алхимии и если честно всё ещё не понимаю: НАФИГА нужно делать такие сложные запросы? Никто не в одном видео этого не объясняет :(
Есть asyncpg, который в паре с датаклассами работает сильно шустрее чем алхимия, при этом запросы у тебя -- чистый SQL, который ты можешь использовать по сути везде, не тратя херову гору времени на изучение алхимии. Можешь детально разобрать на кой чёрт нужна алхимия кроме миграций?
На сколько я понимаю, алхимию используют для описания моделей таблиц для миграций, но зачем нужно остальное -- не понятно от слова совсем. Подобные запросы через ORM выглядят как сильное усложнение, которое усложняет читаемость запросов и добавляют накладных расходов, а Python и так не самый шустрый язык, и самое главное не понятно ДЛЯ ЧЕГО это усложнение в целом нужно, ведь в asyncpg параметры подставляются в $1, $2 что по идеи так же защищает от инъекций, а валидацию можно проделать через pydantic и датаклассы, сохраняя простоту SQL...
1. Алхимия дает удобный способ строить запросы любой сложности через простые функции select, join, group_by и так далее. В случае с asyncpg нужно писать такой функционал самому либо использовать имеющийся (кстати интересно, что есть на рынке)
2. Алхимия дает удобный способ работы с joinами, когда нам нужна не табличная структура (без вложенностей), а вложенная структура. Например, на фронтенде нужен список всех работников, а также для каждого работника все его резюме. Это простой пример вложенной структуры, бывают и более сложные (больше уровней вложенности, больше вложенностей). Так вот Алхимия делает за нас грязную работу: проходит циклами по табличной структуре и конвертирует ее к приемлемой. Я покажу, как это делается, в следующем уроке. Иначе нам пришлось бы самим проходить циклами внутри циклов (если несколько уровней вложенности) и преобразовывать табличную структуру к вложенной
3. ORM - возможность работать с Python объектами вместо таблиц базы данных. Часть людей использует самые примитивные запросы к базе - чтение, запись, удаление, изменение. Для таких запросов можно плохо понимать устройство базы и SQL, но по-прежнему писать +- адекватные запросы, то есть уровень входа в Алхимию невысокий. Насколько мне известно, часть людей сначала знакомятся с Алхимией/Django ORM, и лишь потом с SQL
4. Типизация дает подсказки в IDE, с которыми разработчик работает эффективнее, допуская меньше ошибок
5. Все пишут SQL код по разному: по разному ставят запятые, переносы строк, кто-то пишет в нижнем регистре, кто-то использует функцию cast, а кто-то :: и так далее. Чтобы не договариваться между всеми разработчиками о стиле написания SQL кода (что довольно сложно), Алхимия предлагает единый стиль написания запросов (см пункт 1), чтобы код был читабельнее.
6. Миграции
Алхимия используется не для скорости работы кода, а скорее для скорости разработки и возможности поддерживать код в будущем
@@artemshumeiko Спорные аргументы или я их неправильно понял:
1. Чистый SQL = удобный способ работать с БД. Ведь SQL простой и понятный язык запросов. Пример запроса в твоем видео через ORM сильно сложнее и менее читабельнее, чем твой же SQL-запрос в PGAdmin. Про какой функционал для работы с ayncpg ты говоришь я чуть не понял. Просто пишешь запросы и все.
2. С join можно и с SQL легко работать и читать они будут легче. На счет вложенной структуры не скажу, никогда не делал подобную задачу в SQL, но думаю ради 1 плюса тратить десятки часов времени за изучение построения запросов через алхимию -- слабый аргумент. Я слышал не мало историй, как ребята хорошо зная SQL написали SQL запрос за минуту, а потом тратили часы на изучение как это сделать в алхимии.
3. Python объекты можно сделать через датаклассы для результат запроса к БД. Туда же можно и прикрутить Pydantic одним декоратором. Это связка в 2-3 раза быстрее, чем тоже самое через алхимию...
4. Типизация чего? Результатов запросов? Так мы в любом случае пишет датакласс для выходного результат. Можно использовать датакласс не только для типизации выходных данных, но и инициировать его, передавай результаты SQL-запроса в датакласс. Сильно проще в построении запросов + быстрее работают запросы.
5. Есть конвенция по SQL. Честно признаюсь не все помню, но если задаться целью единый стиль решается очень просто = прочитать всем конвенцию (они дастаточно небольшая к слову)
6. Это понятно, но насколько я понимаю для миграций достаточно описать таблицы. Строить запрос через ORM для этого не обязательно ведь...
Планируется курс с 0 по Python?
нет, моя миссия - покрывать материал, которого мало или вообще нету на ютубе. Курсов по Python очень много
Видимо оговорился, в order by же можно подставлять псевдонимы из селекта
Имеете в виду в алхимии? В sql нельзя
@@artemshumeiko комментарии с ссылками, видимо, удаляются, но так как order by выполняется после select, то в sql можно использовать псевдонимы столбцов с order by, только с ним
Пытаюсь разобраться с обычными оконными функциями. Без подзапросов и прочего.
Для пагинации нужно добавить в вывод поле total_count - количество строк до применения limit
select dr.direction_code, dr.record_code, dr.record_name, dr.record_num, rv.validity, rv.values
,COUNT(*) over () as TotalCount
from nsi.direction_record dr
left join nsi.record_version rv
ON rv.direction_record_id = dr.direction_record_id
and rv.validity @> now() :: timestamptz
where not dr.is_delete
and dr.direction_code = 'стр'
order by dr.record_num
Простой sql работает.
Но на алхимию не перевести
А почему нельзя вместо WITH AS обернуть еще раз весь запрос в подзапрос и потом просто сделать еще раз SELECT
Можно)
Какие 100 тысяч?! Я за 35 тысяч и с питоном и sql и экселем работал... И отчетов куча
Соболезную
35 - это зп интерна, хотя в Яндексе/Сбере и другим крупных компаниях стажером платят ещё больше, вроде где-то 70
@@TAF3000 а там это полная ставка!