SQLAlchemy: How to JOIN tables | CTE | Subqueries | Window functions #8

Sdílet
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 запрос при помощи Алхимии

Komentáře • 40

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

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

  • @AS-fk5fw
    @AS-fk5fw Před 6 měsíci +8

    за 2 часа с огромным удовольствием прошёл этот курс 🔥 и пошел смотреть ещё 4 ролика по раннему доступу с подпиской на бусти. я джун с опытом коммерческой разработки менее года и открыл для себя новое. А точнее я сталкивался с этим на работе, но ты круто объяснил, что добавило мне уверенности. спасибо!

  • @user-sy2zh6nj7g
    @user-sy2zh6nj7g Před 26 dny +1

    Респект автору. Объясняет аки боженька.

  • @Katar1x
    @Katar1x Před 7 měsíci +5

    Лучший)

  • @asg5511
    @asg5511 Před 6 měsíci +4

    Урок топовый!

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

    Очень интересно

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

      Спасибо) стараюсь объяснять сложное простым языком

  • @Elena-ux2kb
    @Elena-ux2kb Před 6 měsíci +4

    Артем, добрый день! В одном из видео вы упомянули, что SQLAlchemy может возвращать структуру объекта json, в которой будут отдаваться сгруппированные списки резюме по воркеру. Очень жду эту тему :-)

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

      Про сгруппированные по воркеру будет в следующем видео (9), а про json в 11 видео ;)

  • @user-js3yt8lg7o
    @user-js3yt8lg7o Před 6 měsíci +3

    Спасибо за урок. Как всегда отличные видео) Не думаешь снять такие же видосы про Redis? Что это такое как с этим работать через питон ну и все такое.

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

      Хорошее предложение) Подумаю

  • @AOF_Materials
    @AOF_Materials Před měsícem +1

    Привет. У меня в VSCode Intellisense гораздо слабее работает. Где можно посмотреть твои настройки VSCode (расширения и тд)?

  • @shakh555
    @shakh555 Před měsícem +2

    не понимаю для чего нужен aliased, если можно вместо r = aliased(ResumesOrm) просто написать r = ResumesOrm
    мы же в питоне 😀, питон по умолчанию дает такие возможности, хоть по-русски обзови

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

    Хороший курс, кстати алиасы работают для сортировки, только затестил 5:40

  • @iJaVolo
    @iJaVolo Před 5 měsíci +1

    Артём, спасибо за этот курс! Ещё не досмотрел, но пока всё работает))) Задолбался я курить мануалы старые и непонятные, а тут всё понятно)
    Может уже спрашивали. Ты чередуешь как здороваешься "Всем привет! Меня зовут Артём" и "Всем привет! Меня зовут Артём Шумейко" - это что за такое интересное?))

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

      Вас понял. Постараюсь определиться с приветствием ;)

    • @iJaVolo
      @iJaVolo Před 5 měsíci

      @@artemshumeiko А я подумал, что это пасхалка какая или просто шутка)

  • @nachtblume6629
    @nachtblume6629 Před 4 měsíci +1

    Можем так делать, нужно так делать, но мы не будем так делать 😂😂😂😂

  • @user-nf1lt1gx9w
    @user-nf1lt1gx9w Před 2 měsíci +1

    Здравствуйте, Артем. Мне кажется проще затащить нужные данные и обработать их, используя pandas. Подскажите, пожалуйста, такой подход может быть использован?, Если нет, то почему?

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

      1) pandas медленный. Мы используем SQL, чтобы внутри запроса прописать все нужные фильтры, поля и сортировки. СУБД справляется с этим в разы быстрее
      2) pandas не работает с вложенными данными. На фронт или клиенту часто нужно отдать вложенные данные, а pandas именно про работу с табличными данными
      3) даже если использовать pandas, SQLAlchemy никуда не уходит, потому что запросы по прежнему нужно как-то писать. И делать это через ORM приятнее и безопаснее, чем через тот же psycopg или любой другой драйвер для написания сырых SQL запросов

  • @user-yt6zc9vc4v
    @user-yt6zc9vc4v Před měsícem +1

    А будет курс по RabbitMQ и взаимодействие между микросервисами и тому подобные?

    • @artemshumeiko
      @artemshumeiko  Před měsícem

      Курс не уверен, но видео точно будет

  • @100ksmurf-8
    @100ksmurf-8 Před 6 měsíci +2

    Привет! Спасибо за контент. Пересмотрел все твои видео по FastAPI и алхимии, очень годно объясняешь)
    Интересный вопрос: насколько реально нужны эти костыли и палки? Я смотрел много видео по алхимии и если честно всё ещё не понимаю: НАФИГА нужно делать такие сложные запросы? Никто не в одном видео этого не объясняет :(
    Есть asyncpg, который в паре с датаклассами работает сильно шустрее чем алхимия, при этом запросы у тебя -- чистый SQL, который ты можешь использовать по сути везде, не тратя херову гору времени на изучение алхимии. Можешь детально разобрать на кой чёрт нужна алхимия кроме миграций?
    На сколько я понимаю, алхимию используют для описания моделей таблиц для миграций, но зачем нужно остальное -- не понятно от слова совсем. Подобные запросы через ORM выглядят как сильное усложнение, которое усложняет читаемость запросов и добавляют накладных расходов, а Python и так не самый шустрый язык, и самое главное не понятно ДЛЯ ЧЕГО это усложнение в целом нужно, ведь в asyncpg параметры подставляются в $1, $2 что по идеи так же защищает от инъекций, а валидацию можно проделать через pydantic и датаклассы, сохраняя простоту SQL...

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

      1. Алхимия дает удобный способ строить запросы любой сложности через простые функции select, join, group_by и так далее. В случае с asyncpg нужно писать такой функционал самому либо использовать имеющийся (кстати интересно, что есть на рынке)
      2. Алхимия дает удобный способ работы с joinами, когда нам нужна не табличная структура (без вложенностей), а вложенная структура. Например, на фронтенде нужен список всех работников, а также для каждого работника все его резюме. Это простой пример вложенной структуры, бывают и более сложные (больше уровней вложенности, больше вложенностей). Так вот Алхимия делает за нас грязную работу: проходит циклами по табличной структуре и конвертирует ее к приемлемой. Я покажу, как это делается, в следующем уроке. Иначе нам пришлось бы самим проходить циклами внутри циклов (если несколько уровней вложенности) и преобразовывать табличную структуру к вложенной
      3. ORM - возможность работать с Python объектами вместо таблиц базы данных. Часть людей использует самые примитивные запросы к базе - чтение, запись, удаление, изменение. Для таких запросов можно плохо понимать устройство базы и SQL, но по-прежнему писать +- адекватные запросы, то есть уровень входа в Алхимию невысокий. Насколько мне известно, часть людей сначала знакомятся с Алхимией/Django ORM, и лишь потом с SQL
      4. Типизация дает подсказки в IDE, с которыми разработчик работает эффективнее, допуская меньше ошибок
      5. Все пишут SQL код по разному: по разному ставят запятые, переносы строк, кто-то пишет в нижнем регистре, кто-то использует функцию cast, а кто-то :: и так далее. Чтобы не договариваться между всеми разработчиками о стиле написания SQL кода (что довольно сложно), Алхимия предлагает единый стиль написания запросов (см пункт 1), чтобы код был читабельнее.
      6. Миграции
      Алхимия используется не для скорости работы кода, а скорее для скорости разработки и возможности поддерживать код в будущем

    • @100ksmurf-8
      @100ksmurf-8 Před 6 měsíci

      ​@@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 для этого не обязательно ведь...

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

    Планируется курс с 0 по Python?

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

      нет, моя миссия - покрывать материал, которого мало или вообще нету на ютубе. Курсов по Python очень много

  • @maisiq
    @maisiq Před 5 měsíci +1

    Видимо оговорился, в order by же можно подставлять псевдонимы из селекта

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

      Имеете в виду в алхимии? В sql нельзя

    • @maisiq
      @maisiq Před 5 měsíci

      @@artemshumeiko комментарии с ссылками, видимо, удаляются, но так как order by выполняется после select, то в sql можно использовать псевдонимы столбцов с order by, только с ним

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

    Пытаюсь разобраться с обычными оконными функциями. Без подзапросов и прочего.
    Для пагинации нужно добавить в вывод поле 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 работает.
    Но на алхимию не перевести

  • @user-cf2lc2rq4v
    @user-cf2lc2rq4v Před měsícem +1

    А почему нельзя вместо WITH AS обернуть еще раз весь запрос в подзапрос и потом просто сделать еще раз SELECT

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

    Какие 100 тысяч?! Я за 35 тысяч и с питоном и sql и экселем работал... И отчетов куча

    • @nikito7ka
      @nikito7ka Před 5 měsíci +1

      Соболезную

    • @TAF3000
      @TAF3000 Před 4 měsíci

      35 - это зп интерна, хотя в Яндексе/Сбере и другим крупных компаниях стажером платят ещё больше, вроде где-то 70

    • @user-ps5gn6jl5p
      @user-ps5gn6jl5p Před 4 měsíci

      @@TAF3000 а там это полная ставка!