Таймкоды: Alembic: 0:10 Введение в Alembic 1:35 Установка Alembic 1:55 Настройка Alembic 48:01 Исправление для настройки подключения к ДБ 8:35 Создание первой миграции 14:24 Выполнение и откат миграций 40:22 Слежение за версиями миграций Создание моделей: 18:00 Создание User 44:52 Добавление строкового представления 21:18 Создание Post 22:00 - Значения по умолчанию 23:02 - Создание внешнего ключа 25:51 Добавление связей между моделями (relationship) "один ко многим" и использование TYPE_CHECKING 29:42 Создание Profile, добавление связей "один к одному" 31:48 Использование Mixin (с использованием declared_attr) для избежания дублирования кода. CRUD: 42:52 create_User 46:18 рефакторинг Config.py 48:17 get_User (два варинта) 51:43 create_Profile 54:10 show_Users_with_Profiles 55:44 Использование option(JoinedLoad()) 58:10 create_Post 1:01:18 get_Users_with_Posts 1:02:41 Использование Unique и option(SelectInLoad()) 1:06:27 get_Post_with_Users 1:08:24 get_User_with_Posts_and_Profile 1:10:22 get _Profile_with_User_and_Posts - вложенные и комбинированные join() (для подгрузки данных и фильтрации ) 1:13:31 - ИТОГИ PS опции joinedload() используем для отношения "один к одному", а selectinload() для отношения "один ко многим"
PS: joinedload() используем для _подгрузки_ отношения ".. к одному", а selectinload() для _подгрузки_ отношения "... ко многим". не важно, что слева. потому что может быть "один ко многим", а может быть и "многие ко многим", и всё равно надо использовать selectinload, потому что это всё "ко многим"
Ты научил меня Python 2 года назад)) Я смотрел твой курс на одной из образовательных платформ Чувак, ты лучший! Очень рад увидеть твой контент на RUclips.
Как приятно 😊 Очень круто! В какой сфере сейчас работаете? Удалось сделать программирование основной занятостью? Спасибо большое, очень приятный отзыв 🥰 Очень рад трудиться 💪
Спасибо за эти видео! Читать доку к алхимии то еще удовольствие. Все понятно, только быстро, приходится пересматривать. Не первый раз твои видео появляются в поисковой выдаче. Это знак, так держать!)
Все супер! 👌👍👍👍 За такое относительно короткое время просто море информации, которое нужно будет переварить однозначно продолжаю изучение на твоем канале ✌
Сурен, мне очень нравятся все ваши видео. подписалась не задумываясь.🔥 Очень много информации в каждой ваше фразе. Пересматриваю по несколько раз, чтобы ничего не упустить и каждый раз открываю что-то новое для себя! Спасибо вам за бесценную информацию, за ваш труд. 🥰💪
Сурен, Вы невероятны! Вы первый преподаватель, кого я не только не смотрю на скорости 1,25-2, но даже пытался смотреть на 0,75. А ведь я чаще смотрю на иностранных, чужих для меня языках. Сумасшедшая скорость и качество. Так держать! P.S. надеюсь в реальной жизни Вы не такой быстрый :)
Привет. Очень понравилась подача материала. Пожалуйста, не останавливайся по поводу FastAPI. Хотелось бы послушать тебя по поводу аутентификации, авторизации, правам доступа и т.д.
Супер полезная серия видео, пожалуйста, продолжай! Очень толково и глубоко разбираешь вопрос, не видел таких подробных видео на других каналах, спасибо огромное!
Супер крутой контент и подача. Всё максимально чётко, настройка конфигов, практичные кейсы, современные инструменты и подходы. Большое спасибо за ваш труд!
Спасибо огромное за качественный контент, разложенный по полочкам. Буду орать от радости, если запилите видео про использование Dash Plotly c SQLAlchemy 2.0.
Ты супер братан. Впервые ввижу такой детальный разбор, хотя посмотрел уже не мало уроков про fastapi. Продолжай в том же духе. Ждем новые ролики. Прошу в следующих уроках учесть логирование мидлварки и про типы Проектирования приложения mvc onion architecture и clean architecture
Спасибо за контент! Это действительно очень полезный материал. Очень интересна тема асинхронной работы питона. На Ютубе очень мало хорошего контента по данной теме, по этому не совсем понятны некоторые шаги😅
Уровень космос! Сурен, пожалуйста запилите пару выпусков по авторизации и аутентификации FastApi! Спасибо за видос ! Утром поставлю лайк! Очень качественный контент! Круто!
Да уж. Всегда встречался с проблемой при просмотре подобных видео, что информации полезной как таковой нет, наоборот - больше вопросов возникает. Тут совсем иначе: информации так много, что приходится делать перерывы на "переваривание" информации, ибо понимание дается очень трудно (хотя, чего я хотел, когда еще совсем недавно не знал, что за return у функций, лол).
"...так, давайте в этот раз наберём СЕМЬДЕСЯТ лайков..." :D Реакция: положительная. Рад, что порядок фидбека не оправдал ожидания, в лучшую сторону) Приятно, когда хороший материал получает заслуженное внимание. С другой стороны, немного страшно от количества интересующихся - успокаиваю себя тем, что большинство уже нашло работу и просто подтягивает те знания, которые уже и так должны были иметься (:
Хах. Ага, такие времена были, даже до сотни лайков не доходило. Рад, что тема зашла, и ролик продолжает набирать просмотры и лайки. Всё ок, дефицит огромный, так что продолжайте изучать, разбираться, и обязательно найдёте хорошее место работы
Спасибо за видео. Интересно было бы посмотреть, как работать с базой из Celery, когда интенсивно используются одни и те же таблицы из API и из Celery, например, из периодических задач.
у меня чуть меньше года опыта коммерческой разработки и подсветил тебе то, что встречал на практике. спасибо, Сурен! подскажи, пожалуйста, что за тема в PyCharm?
Т.е. selectinload и joinload используются в зависимости от связи между таблицами? В случае связи один ко многих следует использовать selectinload чтобы избавиться от костылей с unique? И еще вопрос: а что лучше из них? Один запрос с джоином(или несколькими джоинами одновременно) или несколько запросов без джоинов используя данные о связях как в показанном на видео примере, где второе селект использовал айди пользователей, полученных на n-1 запросе. Видео огонь. 👍👍👍👍👍
Спасибо! Да, разница в том, что связь ".. ко многим" нужно подгружать через selectinload Но, на самом деле, связь ".. к одному" тоже можно, но зависит от ситуации, где-то это просто неуместно. Уместно когда нам надо всего несколько записей подтянуть в связке к огромному количеству. Например, три отдела и сотни-тысячи сотрудников. И хоть отношение сотрудника к отделу это "к одному" (у сотрудника только один отдел), тут можно подгрузить через selectinload, чтобы вытащить эти три отдела в новом запросе, а не цеплять к каждому сотруднику отдельно в SQL
Сурен подскажи пожалуйста, почему ты используешь в крудах core алхимию, а не до конца используешь декларативные методы, например, session.query(User).filter_by(username=username). Есть какой то профит или привычка?
@@andreykorolev8643 привет! Это старый стиль, я раньше так писал. Начиная с 1.4 и 2.0 принято универсальный statement писать. При этом я использую ORM подход, например тот же select(User).where(User.username == 'john') это вполне ORM подход, мы же обращаемся к свойствам модели и получаем в ответ модель
@@SurenKhorenyan Скажите, а у вас есть где-то видео по поводу настройки админки на фаст-апи или шаблонов? Я занимаюсь переносом проекта джанго, на фаст АПи, там и то, и другое нужно, пока не понимаю, откуда начать
@@lajilit приходите в тг чат, там обсуждали админку не так давно, по горячим следам можете спросить. И я бы там обсудил вашу ситуацию, насколько вообще нужно заниматься переписыванием с Джанго на что-то
@@SurenKhorenyan я очень долго не могла понять, почему алембик с каждой новой миграцией предлагает заново создавать таблицы, оказалось, что он смотрел только в паблик, и только спустя часа три я нашла как это настроить
Спасибо за лекцию, вообще круто! Буду ждать развития темы!) Вопрос: 1:04:05 и далее, выдача в терминале -Post(id=,,, username='SQLA 2.0' .... это же не юзернэйм на тайтл должен быть? или я что-то неверно понял или подскажи пожалуйста как вывести корректно?!
Пожалуйста! Мне очень приятно, что вам понравилось. Продолжение уже в монтаже. Хаа, да, действительно, при печате информации о посте должен быть title, а не username. вот это у вас внимательность! ошибка вот тут в формировании строки github.com/mahenzon/micro-shop/blob/1d5b9820e2185786599748047bd64fe232079e7c/core/models/post.py#L21 я указал `username={self.title!r}`, а должно быть `title={self.title!r}` поправлю в одном из следующих выпусков 🙂
Привет, спасибо за видос. только немного не понял чем selectinload лучше joinedload при запросе ко многим. Сам пока тоже не разобрался до конца с точки зрения производительности как будет лучше и как отрабатывает под капотом unique
Привет, пожалуйста. Он лучше тем, что делает дополнительный запрос, чтобы вытащить только недостающие данные. А joinedload грузит в том же запросе, из-за чего дублируются данные в ответе. Метод unique тут помогает правильно прочитать ответ, но просто я придерживаюсь правила, что грузить "ко многим" лучше через selectinload
Практический вопрос. Если в BaseModel прописать колонку id, то ее отнаследуют все другие таблицы (и это хорошо), но id будет последней колонкой, это не очень приятно. как сделать так чтобы она была первой (или так работает наследование, и ничего не сделать?)?
угу, тоже замечал, что колонка генерируется не первой. при желании сделать отображение в БД в таком порядке, чтобы колонка id шла первой, можно в alembic миграции подвинуть создание колонки id в самое начало create_table. это придётся делать для каждой создаваемой таблицы, но зато получите ожидаемое отображение
Если я правильно понимаю, то названия таблиц в бд формируются благодаря методу __tablename__, который мы переопределили в классе Base. Правильно? Если это так, то я чуть поздно допёр до этого и оставлял в каждой новой модели __tablename__, выходит это бесмысленно.
На основе этого свойства создаётся имя таблицы, да. Вполне нормально объявлять для каждой модели это значение отдельно. Но если можно автоматизировать, то почему бы и нет. Для этого и используется declared_attr
Подскажите как в Pycharm вывести в редакторе подсказку "наименования параметров функции"? Как здесь ruclips.net/video/LKkn-2FId8w/видео.html - "table_name", "__name_pos" и т.д.
Отличное видео! Можно вопрос? Где та грань использования асинхронного доступа к базе данных и синхронного. Это количество запросов к базе или какие то ещё есть факторы? Спасибо!
Круто, пожалуйста! Рад, что понравилось Асинк надо начинать использовать только с того момента, когда у вас выросла нагрузка на приложение, и запросы долго обрабатываются. Это сотни запросов в секунду от пользователей. Так что в простых личных проектах можно и на синхронщине писать Однако, если вы сейчас придёте на работу, где надо писать веб приложение, то там скорее всего будет именно асинк подход. В коммерции сейчас так модно
Добрый день а как настроить для alembic схему по умолчанию что бы он там проверял таблици и при наличии в миграциях прописывал апгрейды, а то в постгресе он всё время пытается в паблик схеме всё делать
@@SurenKhorenyan на модели я поставил схему но тогда алембик ругается что не может найти Foreign key так как по умолчанию он пытается работать с public
В первую очередь мне так проще, так как почти все примеры связаны в рамках видео Во вторую сложнее, так как платить монтажеру за два ролика, а не за один, а я из своего кармана плачу за монтаж и превью
@@SurenKhorenyan , благодаря видео в чате (кружочек) нашел искусственный интеллект для программистов он и помог проблема решилась созданием роли (потом на этой схеме назначьте права для юзера, который используете для программы) CREATE ROLE alembic_test LOGIN PASSWORD '123456'; ALTER ROLE alembic_test SET search_path TO test_schema;
Poetry конечно крутой, но вот если возникает конфликт в файле poetry.lock, как его адекватно смержить? По идее мы не должны его трогать, как поступать в таких случаях?
poetry lock мы руками не трогаем, поэтому главное чтобы в pyproject toml всё было как нам нужно, а потом в терминале сделать `poetry lock --no-update` чтобы перелочить
Привет! Хах, спасибо К сожалению, инициатива тут должна идти сверху, а не исходить от меня. Мне понравилось сотрудничать со скилбоксом, так что если по какой-то причине продюсер решит, что нужна перезапись, и придёт ко мне, я вряд ли откажусь 🙂
классный фреймворк! думаю, про него надо сделать видео. но слабо представляю себе его в реально большом проекте. разве что в небольших личных проектах. всё же зачастую нам нужно отдельно управлять данными, которые мы храним, и данными, которые приходят и уходят по сети
ruclips.net/video/LKkn-2FId8w/видео.html Почему Алембик поле id в самый конец запихивает? У меня тоже из-за наследования классов , наследуемые поля в самый конец улетают
Всё верно, дело в наследовании. Сначала алхимия читает колонки с модели, потом с родителя При желании можно айди до выполнения миграции сдвинуть в начало в сгенерированном файле. Если охота, конечно 🙂
здравствуйте. только вручную привести БД и миграции к такому состоянию, будто вы выполняли эти миграции изначально. вручную описать миграции, в бд проставить номер миграции
Таймкоды:
Alembic:
0:10 Введение в Alembic
1:35 Установка Alembic
1:55 Настройка Alembic
48:01 Исправление для настройки подключения к ДБ
8:35 Создание первой миграции
14:24 Выполнение и откат миграций
40:22 Слежение за версиями миграций
Создание моделей:
18:00 Создание User
44:52 Добавление строкового представления
21:18 Создание Post
22:00 - Значения по умолчанию
23:02 - Создание внешнего ключа
25:51 Добавление связей между моделями (relationship) "один ко многим" и использование TYPE_CHECKING
29:42 Создание Profile, добавление связей "один к одному"
31:48 Использование Mixin (с использованием declared_attr) для избежания дублирования кода.
CRUD:
42:52 create_User
46:18 рефакторинг Config.py
48:17 get_User (два варинта)
51:43 create_Profile
54:10 show_Users_with_Profiles
55:44 Использование option(JoinedLoad())
58:10 create_Post
1:01:18 get_Users_with_Posts
1:02:41 Использование Unique и option(SelectInLoad())
1:06:27 get_Post_with_Users
1:08:24 get_User_with_Posts_and_Profile
1:10:22 get _Profile_with_User_and_Posts - вложенные и комбинированные join() (для подгрузки данных и фильтрации )
1:13:31 - ИТОГИ
PS опции joinedload() используем для отношения "один к одному", а selectinload() для отношения "один ко многим"
Ооо, крутяк, спасибо
Сейчас проверю и добавлю в описание
PS: joinedload() используем для _подгрузки_ отношения ".. к одному", а selectinload() для _подгрузки_ отношения "... ко многим". не важно, что слева. потому что может быть "один ко многим", а может быть и "многие ко многим", и всё равно надо использовать selectinload, потому что это всё "ко многим"
@@SurenKhorenyan Спасибо , за уточнение.
Очень хорошая подача материала, и много полезной информации, которую не встречал на других каналах, продолжай в том же духе, лайк)
Спасибо большое! Рад, что было полезно 🥰
Превосходная подача материала! Всё подробно и в то же время ничего лишнего. Преподавать ваше призвание! Спасибо за курс.
@@Alex-zl7wg пожалуйста! Рад, что вам понравилось 🥰
Ты научил меня Python 2 года назад))
Я смотрел твой курс на одной из образовательных платформ
Чувак, ты лучший! Очень рад увидеть твой контент на RUclips.
Как приятно 😊
Очень круто! В какой сфере сейчас работаете? Удалось сделать программирование основной занятостью?
Спасибо большое, очень приятный отзыв 🥰
Очень рад трудиться 💪
Чувак, Ты лучший!
Самая подробная и полезная информация по темам.
Легкая подача.
Спасибо, так держать!
Спасибо большое, очень приятно! Рад трудиться 🥰
Дальше больше 💪
Других авторов приходится ускорять на 2х. Здесь же пришлось замедлять :) Спасибо! Ценный материал и отличная подача!
Хах, бывает 😅
Супер! Рад
Благодарю за объяснение. Доступно и интересно подана информация, рассмотрены различные варианты. Великолепная подача материала, продолжайте дальше)
Класс, пожалуйста! Рад, что вам понравилось.
Дальше больше, спасибо
Казалось бы, те же самые 15 минут на объяснение алембик, но без воды и на понятном языке (спокойно все применил в своем проекте). Благодарю.
Пожалуйста! Рад, что вам было понятно и пригодилось 😊
Классный контент! Смотрел твои лекции в курсе по Django. Очень доступно и понятно. Очень обрадовался, когда стал замечать твои видео на ютюбе.
Круто, спасибо! Рад трудиться! 🥰
Спасибо за эти видео! Читать доку к алхимии то еще удовольствие. Все понятно, только быстро, приходится пересматривать.
Не первый раз твои видео появляются в поисковой выдаче. Это знак, так держать!)
Кайф, пожалуйста! Рад, что вам нравится
Все супер! 👌👍👍👍
За такое относительно короткое время просто море информации, которое нужно будет переварить
однозначно продолжаю изучение на твоем канале ✌
Кайф, спасибо! Я рад, что вам понравилось 😊
Смотрю уже пару дней. Пока это видео оказалось самым тяжелым, но не менее информативным и познавательным. Спасибо за контент!
@@crayscraysovich6017 держитесь! Рад, что вам нравится. Пожалуйста ☺️
Это великолепно! Вы отлично объясняете. Огромное спасибо за труды!
@@ДмитрийСмирнов-щ7ю класс, пожалуйста! Очень приятно 🥰
Сурен, мне очень нравятся все ваши видео. подписалась не задумываясь.🔥
Очень много информации в каждой ваше фразе. Пересматриваю по несколько раз, чтобы ничего не упустить и каждый раз открываю что-то новое для себя!
Спасибо вам за бесценную информацию, за ваш труд. 🥰💪
Кайф, пожалуйста!
Очень приятно, спасибо за такой теплый и подробный отзыв 😊
Сурен, Вы невероятны! Вы первый преподаватель, кого я не только не смотрю на скорости 1,25-2, но даже пытался смотреть на 0,75. А ведь я чаще смотрю на иностранных, чужих для меня языках. Сумасшедшая скорость и качество. Так держать! P.S. надеюсь в реальной жизни Вы не такой быстрый :)
Спасибо!
Хах, потихоньку начинаю говорить медленнее, было много жалоб на скорость.. 😅
Привет. Очень понравилась подача материала. Пожалуйста, не останавливайся по поводу FastAPI. Хотелось бы послушать тебя по поводу аутентификации, авторизации, правам доступа и т.д.
Спасибо, приятно! Обязательно будет продолжение. В одном из следующих видео будет и про авторизацию
Крайне полезная информация! Часто не успеваю за твоим ходом мысли)) Спасибо, Сурен!
Пожалуйста!
Хах, можно замедлить видео 😅
@@SurenKhorenyan 😌
Или по ноздре дать
@@tagabenz9808 осуждаем насилие, не надо ничего подобного
Супер полезная серия видео, пожалуйста, продолжай! Очень толково и глубоко разбираешь вопрос, не видел таких подробных видео на других каналах, спасибо огромное!
Пожалуйста!
Круто, спасибо большое за отзыв! После таких сообщений очень хочется продолжать 🥰
Лучшее объяснение по FastAPI!
Сурен, спасибо большое!
Будут ли видео про (docker + fastapi) ?
Кайф, пожалуйста!
Да, будет когда-то. Не в ближайшее время
Это легендарно, Сурен. Спасибо!
@@alexchto класс, пожалуйста!
Это было сложно и просто одновременно. Спасибо за контент.
Параллельно прохожу твой курс на Merion academy!
@@anywaysadness6024 пожалуйста!
Круто, удачи с прохождением 😊
Отличная подача. Хорошая скорость. Отлично выстроена последовательность в объяснении материала. Спасибо! На пару голов выше множества каналов. 👍
Кайф, очень приятно, спасибо!
Пожалуйста, рад, что вам понравилось.
Спасибо за материал, одна из лучших подач по FastAPI. Очень жду новых роликов!
Круто, пожалуйста!
Спасибо за отзыв
Новые ролики обязательно будут
Супер крутой контент и подача. Всё максимально чётко, настройка конфигов, практичные кейсы, современные инструменты и подходы. Большое спасибо за ваш труд!
Пожалуйста! Очень приятно получать такие отзывы, это мотивирует делать новые видео. Спасибо и вам!
Спасибо огромное за качественный контент, разложенный по полочкам. Буду орать от радости, если запилите видео про использование Dash Plotly c SQLAlchemy 2.0.
Пожалуйста! Рад трудиться 🥰
Не знаком с этой штукой, надо будет изучить. Спасибо за наводку
Сурен, спасибо большое. Как всегда супер полезно.
Как по мне, ваши видео нужно к документации sqlalchemy прикладывать)
Круто, пожалуйста! Очень приятно, спасибо за такие классные комментарии 🥰
Ты супер братан. Впервые ввижу такой детальный разбор, хотя посмотрел уже не мало уроков про fastapi. Продолжай в том же духе. Ждем новые ролики. Прошу в следующих уроках учесть логирование мидлварки и про типы Проектирования приложения mvc onion architecture и clean architecture
Супер, пожалуйста!
Спасибо за контент! Это действительно очень полезный материал. Очень интересна тема асинхронной работы питона. На Ютубе очень мало хорошего контента по данной теме, по этому не совсем понятны некоторые шаги😅
Круто, пожалуйста! Рад трудиться.
Если вдруг что-то не поняли в видео, обязательно пишите комментарии, в новых видео буду всё разбирать
Уровень космос! Сурен, пожалуйста запилите пару выпусков по авторизации и аутентификации FastApi! Спасибо за видос ! Утром поставлю лайк! Очень качественный контент! Круто!
Класс, спасибо большое за такой яркий отзыв! Мне очень приятно 🥰
Обязательно будет по авторизации через пару роликов (наверное, в следующем месяце)
+ spasibo!@@SurenKhorenyan
Да уж. Всегда встречался с проблемой при просмотре подобных видео, что информации полезной как таковой нет, наоборот - больше вопросов возникает. Тут совсем иначе: информации так много, что приходится делать перерывы на "переваривание" информации, ибо понимание дается очень трудно (хотя, чего я хотел, когда еще совсем недавно не знал, что за return у функций, лол).
Хах, сочту за комплемент 😅
Рад, что ролик был вам полезен!
"...так, давайте в этот раз наберём СЕМЬДЕСЯТ лайков..." :D
Реакция: положительная.
Рад, что порядок фидбека не оправдал ожидания, в лучшую сторону)
Приятно, когда хороший материал получает заслуженное внимание.
С другой стороны, немного страшно от количества интересующихся - успокаиваю себя тем, что большинство уже нашло работу и просто подтягивает те знания, которые уже и так должны были иметься (:
Хах. Ага, такие времена были, даже до сотни лайков не доходило. Рад, что тема зашла, и ролик продолжает набирать просмотры и лайки.
Всё ок, дефицит огромный, так что продолжайте изучать, разбираться, и обязательно найдёте хорошее место работы
Очень понятное и четкое видео. Спасибо за материал. Хочется такого побольше)
Круто, пожалуйста! Очень приятно получать такие отзывы
Обязательно буду продолжать 🥰
Отличный материал для русскоязычного сообщества, подобных качественных разборов можно посчитать по пальцам, желаю успеха в продвижении канала👍
Спасибо большое! Рад трудиться 😊
Очень здорово, спасибо! Добавил в закладки весь плейлист. Сурен, про деплой этого приложения сделаешь видео?
Круто, пожалуйста!
Про деплой будет, думаю. Надо только добраться
единственный полезный канал на ютуб
спасибо! рад трудиться 😅
Отличный материал и подача! Спасибо, продолжай в том же духе!
Класс, благодарю! Очень приятно 🥰
Максимально понятно всё, спасибо!
крутяк, я рад! пожалуйста!
Спасибо за видео, отличная подача материала
Пожалуйста! Рад, что полезно 😊
Спасибо за видео! Жду продолжение)
Пожалуйста! Обязательно будет 😊
огонь вообще, без всяких пык мык все по делу
круто, спасибо! рад стараться 🥰
супер, было очень полезно освежить в памяти базу по sqla :)
Отлично, рад помочь!
Самый лучший канал!! Хотелось бы видио про аунтефикацию в fast api🎉
Спасибо большое! Очень приятно 😊
Обязательно будет про аутентификацию
Спасибо за видео. Интересно было бы посмотреть, как работать с базой из Celery, когда интенсивно используются одни и те же таблицы из API и из Celery, например, из периодических задач.
Пожалуйста!
Хорошая тема, надо будет рассмотреть обязательно
у меня чуть меньше года опыта коммерческой разработки и подсветил тебе то, что встречал на практике. спасибо, Сурен!
подскажи, пожалуйста, что за тема в PyCharm?
Класс! Пожалуйста
Тема One Dark
Привет, а будет видео по Celery? Очень интересно послушать
Привет! Ага, обязательно будет
Т.е. selectinload и joinload используются в зависимости от связи между таблицами? В случае связи один ко многих следует использовать selectinload чтобы избавиться от костылей с unique?
И еще вопрос: а что лучше из них? Один запрос с джоином(или несколькими джоинами одновременно) или несколько запросов без джоинов используя данные о связях как в показанном на видео примере, где второе селект использовал айди пользователей, полученных на n-1 запросе.
Видео огонь. 👍👍👍👍👍
Спасибо!
Да, разница в том, что связь ".. ко многим" нужно подгружать через selectinload
Но, на самом деле, связь ".. к одному" тоже можно, но зависит от ситуации, где-то это просто неуместно. Уместно когда нам надо всего несколько записей подтянуть в связке к огромному количеству. Например, три отдела и сотни-тысячи сотрудников. И хоть отношение сотрудника к отделу это "к одному" (у сотрудника только один отдел), тут можно подгрузить через selectinload, чтобы вытащить эти три отдела в новом запросе, а не цеплять к каждому сотруднику отдельно в SQL
@@SurenKhorenyan понял. Спасибо за объяснение.
Отличный материал, большое спасибо! На будущее - расскажи про новый миксин в алхимии 2.0 "MappedAsDataclass"
круто, рад стараться! спасибо за рекомендацию, да, тоже надо будет рассказать про это
Здравствуйте!
спасибо за ролик :)
может захотите сделать про тестирование кода, pytest - было бы очень круто!
класс, пожалуйста! да, про pytest обязательно будет
Спасибо Сурен!
Пожалуйста!
Сурен подскажи пожалуйста, почему ты используешь в крудах core алхимию, а не до конца используешь декларативные методы, например, session.query(User).filter_by(username=username). Есть какой то профит или привычка?
@@andreykorolev8643 привет! Это старый стиль, я раньше так писал. Начиная с 1.4 и 2.0 принято универсальный statement писать. При этом я использую ORM подход, например тот же select(User).where(User.username == 'john') это вполне ORM подход, мы же обращаемся к свойствам модели и получаем в ответ модель
Было бы круто запилить какой-нибудь курс по FastAPI и подробно поковыряться в сложностях фреймворка.
Уже думаю об этом, так как приходят запросы 😅
Видео просто супер полезное, спасибо огромное!
@@lajilit кайф! Пожалуйста 🥰 очень рад
@@SurenKhorenyan Скажите, а у вас есть где-то видео по поводу настройки админки на фаст-апи или шаблонов? Я занимаюсь переносом проекта джанго, на фаст АПи, там и то, и другое нужно, пока не понимаю, откуда начать
@@lajilit приходите в тг чат, там обсуждали админку не так давно, по горячим следам можете спросить.
И я бы там обсудил вашу ситуацию, насколько вообще нужно заниматься переписыванием с Джанго на что-то
ааа чувак какой же ты крутой
Спасибо! Очень приятно 😊
Очень полезное видео, очень помогло. Жаль не рассмотрена работа с несколькими схемами, у меня обе ноги прострелены 😅
Рад, что помогло! А что про несколько схем? У вас есть пример? Несколько разных MetaData? Или несколько разных объектов а алхимии? Такие ролики дальше
@@SurenKhorenyan я очень долго не могла понять, почему алембик с каждой новой миграцией предлагает заново создавать таблицы, оказалось, что он смотрел только в паблик, и только спустя часа три я нашла как это настроить
А, вы про эти схемы.. круто, что удалось разобраться! Если придёте в чат в телеграм и поделитесь кодом, будет вообще супер 😊
Спасибо за лекцию, вообще круто! Буду ждать развития темы!)
Вопрос:
1:04:05 и далее, выдача в терминале
-Post(id=,,, username='SQLA 2.0' ....
это же не юзернэйм на тайтл должен быть?
или я что-то неверно понял или подскажи пожалуйста как вывести корректно?!
Пожалуйста! Мне очень приятно, что вам понравилось. Продолжение уже в монтаже.
Хаа, да, действительно, при печате информации о посте должен быть title, а не username. вот это у вас внимательность!
ошибка вот тут в формировании строки github.com/mahenzon/micro-shop/blob/1d5b9820e2185786599748047bd64fe232079e7c/core/models/post.py#L21
я указал `username={self.title!r}`, а должно быть `title={self.title!r}`
поправлю в одном из следующих выпусков 🙂
@@SurenKhorenyan спасибо, вот тут я и спалился в том, что не знал для чего этот дандерметод))))))
@@ВикторГлухов-р3ь хах, да ничего страшного. вот теперь запомните, что это для приведения объекта к строке 🙂
Хорошее видео. Спасибо
Пожалуйста! Рад, что понравилось 😊
Привет, спасибо за видос. только немного не понял чем selectinload лучше joinedload при запросе ко многим. Сам пока тоже не разобрался до конца с точки зрения производительности как будет лучше и как отрабатывает под капотом unique
Привет, пожалуйста.
Он лучше тем, что делает дополнительный запрос, чтобы вытащить только недостающие данные. А joinedload грузит в том же запросе, из-за чего дублируются данные в ответе. Метод unique тут помогает правильно прочитать ответ, но просто я придерживаюсь правила, что грузить "ко многим" лучше через selectinload
Практический вопрос. Если в BaseModel прописать колонку id, то ее отнаследуют все другие таблицы (и это хорошо), но id будет последней колонкой, это не очень приятно. как сделать так чтобы она была первой (или так работает наследование, и ничего не сделать?)?
угу, тоже замечал, что колонка генерируется не первой. при желании сделать отображение в БД в таком порядке, чтобы колонка id шла первой, можно в alembic миграции подвинуть создание колонки id в самое начало create_table. это придётся делать для каждой создаваемой таблицы, но зато получите ожидаемое отображение
Крутая серия видео по фастапи. Было бы очень интересно посмотреть на регистрацию и авторизацию например через fastapi-users.
Спасибо!
Планирую про авторизацию рассказать через пару выпусков
@@SurenKhorenyan Спасибо, буду ждать.
🔥🔥🔥🔥
🥰🥰🥰
Спасибо за подкаст, под который я сломаюсь с настройкой wsl
пожалуйста! а почему нужно сломаться? да и настройка wsl несложная же
Если я правильно понимаю, то названия таблиц в бд формируются благодаря методу __tablename__, который мы переопределили в классе Base. Правильно? Если это так, то я чуть поздно допёр до этого и оставлял в каждой новой модели __tablename__, выходит это бесмысленно.
На основе этого свойства создаётся имя таблицы, да. Вполне нормально объявлять для каждой модели это значение отдельно. Но если можно автоматизировать, то почему бы и нет. Для этого и используется declared_attr
👌
🫠
спасибо!
Пожалуйста ☺️🥰
спасибо❤
Пожалуйста! 😊
Классное видео спасибо за контент. По М2М планируете сделать разбор ?
Пожалуйста, рад трудиться!
Обязательно будет видео по м2м
Спасибо за видео!
А простое использование Join, вне options(), работает иначе?
Да, обычный .join скорее для фильтрации. А через options joinedload / selectinload это для подгрузки связанных сущностей в мапперы
@@SurenKhorenyan не будет ли тогда замедления при использовании в одном запросе двух типов джоина?
@@dotco22 заметного замедления не наблюдается
Подскажите как в Pycharm вывести в редакторе подсказку "наименования параметров функции"? Как здесь ruclips.net/video/LKkn-2FId8w/видео.html - "table_name", "__name_pos" и т.д.
привет! это в новом интерфейсе по умолчанию активно. вы уже включили новый интерфейс? я в одном из предыдущих видео показывал, как активировать
top!
Thanks!
Отличное видео! Можно вопрос? Где та грань использования асинхронного доступа к базе данных и синхронного. Это количество запросов к базе или какие то ещё есть факторы? Спасибо!
Круто, пожалуйста! Рад, что понравилось
Асинк надо начинать использовать только с того момента, когда у вас выросла нагрузка на приложение, и запросы долго обрабатываются. Это сотни запросов в секунду от пользователей. Так что в простых личных проектах можно и на синхронщине писать
Однако, если вы сейчас придёте на работу, где надо писать веб приложение, то там скорее всего будет именно асинк подход. В коммерции сейчас так модно
Спасибо за ответ! Успехов Вам!
@@mandozor пожалуйста! будут ещё вопросы, обязательно пишите. и вам спасибо ☺
Добрый день а как настроить для alembic схему по умолчанию что бы он там проверял таблици и при наличии в миграциях прописывал апгрейды, а то в постгресе он всё время пытается в паблик схеме всё делать
схему, отличную от public, можно указать на модели, вот пример gist.github.com/h4/fc9b6d350544ff66491308b535762fee
@@SurenKhorenyan на модели я поставил схему но тогда алембик ругается что не может найти Foreign key так как по умолчанию он пытается работать с public
@@максимгостев-р3ь значит вы не указали схему в отношении. Тип так: 'myschema.user.id', приходите с вашим кодом в чат в телеграм, там подскажут.
@@SurenKhorenyan а можно ссылочку на чат просто я тока в "канале Мурена" а там писать нельзя
А почему бы не разделить видео на несколько частей?
В первую очередь мне так проще, так как почти все примеры связаны в рамках видео
Во вторую сложнее, так как платить монтажеру за два ролика, а не за один, а я из своего кармана плачу за монтаж и превью
@@SurenKhorenyanничего не надо делить. Делайте как вам удобно.
@@Qustoosспасибо 😊
В каких случаях оправдано использование не асинхронной алхимии?
Всегда когда вам не хочется работать с асинком
@@SurenKhorenyanв каких случаях может не хотеться?
Я сейчас не знаю ни то, ни другое.
Значит используйте синк. В асинк можно лезть только после опыта в синк. Тем более, что в алхимии в этом плане различия минимальные (по подходу)
А получается мы не можем использовать новые модели Post, User, Profile для аннотации типов при post запросах в эндпоинтах?
Для аннотаций в fastapi views не подходят модели алхимии, fastapi через них не сможет валидировать данные
@@SurenKhorenyan спасибо! А есть способ не дублировать все поля всех таблиц еще и для pedantic? Может уже придумали как связать это все?
@@dmitryvladimirov611 да! Есть такая штука SQLModel, как-нибудь сделаю по ней видео. Объединяет алхимию и pydantic. Но у этого есть и свои минусы
У меня не получилось изменить схему базы данных и создавать миграции.
как это сделать?
Приходите в тг чат, показывайте, поможем
@@SurenKhorenyan , благодаря видео в чате (кружочек) нашел искусственный интеллект для программистов он и помог
проблема решилась созданием роли (потом на этой схеме назначьте права для юзера, который используете для программы)
CREATE ROLE alembic_test LOGIN PASSWORD '123456';
ALTER ROLE alembic_test SET search_path TO test_schema;
@@СергейТравкин-ь1щ Круто! Молодцы что вы разобрались
Poetry конечно крутой, но вот если возникает конфликт в файле poetry.lock, как его адекватно смержить?
По идее мы не должны его трогать, как поступать в таких случаях?
poetry lock мы руками не трогаем, поэтому главное чтобы в pyproject toml всё было как нам нужно, а потом в терминале сделать `poetry lock --no-update` чтобы перелочить
Сурен, запили плз для скиллбокса новые видосы. В курс advanced. Там есть душнила, слушать которого невозможно.
Привет! Хах, спасибо
К сожалению, инициатива тут должна идти сверху, а не исходить от меня.
Мне понравилось сотрудничать со скилбоксом, так что если по какой-то причине продюсер решит, что нужна перезапись, и придёт ко мне, я вряд ли откажусь 🙂
Что думаете про sqlmodel framework. Можно ли его использовать в продакшине
классный фреймворк! думаю, про него надо сделать видео. но слабо представляю себе его в реально большом проекте. разве что в небольших личных проектах. всё же зачастую нам нужно отдельно управлять данными, которые мы храним, и данными, которые приходят и уходят по сети
в каком видео была настройка black?
привет! в предыдущем видео в самом начале было
ruclips.net/video/KWu_RyTKh1s/видео.htmlsi=K5QYPxzqmm_jrvzE&t=59
ruclips.net/video/LKkn-2FId8w/видео.html Почему Алембик поле id в самый конец запихивает? У меня тоже из-за наследования классов , наследуемые поля в самый конец улетают
Всё верно, дело в наследовании. Сначала алхимия читает колонки с модели, потом с родителя
При желании можно айди до выполнения миграции сдвинуть в начало в сгенерированном файле. Если охота, конечно 🙂
@@SurenKhorenyan В доке по Алхимии нашел вариант лучше, вставлять параметр sort_order:
class Base(DeclarativeBase):
__abstract__ = True
id: Mapped[int] = mapped_column(primary_key=True, sort_order=-10)
@@VitalyTolmachev клёво! Надо будет его в новом видео показать
Друзья, помогите. Как можно сделать первую миграцию, если в таблице уже есть данные?
Лайк под видеоролик поставил 😉
здравствуйте. только вручную привести БД и миграции к такому состоянию, будто вы выполняли эти миграции изначально. вручную описать миграции, в бд проставить номер миграции
У меня вообще пустые миргации хотя написал модель! не знаю что теперь делать.
Импорты сделали?