Тёмный

Связь Many To Many в SQLAlchemy 2.0 | Связь между таблицами многие ко многим | Не FastAPI | Видео 4 

Сурен Хоренян
Подписаться 11 тыс.
Просмотров 11 тыс.
50% 1

Опубликовано:

 

22 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 104   
@ТимурНиколаев-я8ш
@ТимурНиколаев-я8ш 6 месяцев назад
самые топовые и понятные видеоуроки, которые на голову обходят курсы от иных блогеров
@SurenKhorenyan
@SurenKhorenyan 6 месяцев назад
Кайф, спасибо большое!
@Alex-zl7wg
@Alex-zl7wg Месяц назад
Превосходная подача материала! Всё подробно и в то же время ничего лишнего. Преподавать ваше призвание! Спасибо за курс.
@SurenKhorenyan
@SurenKhorenyan Месяц назад
Кайф, пожалуйста! И спасибо большое! Очень приятно 🥰
@constkk3153
@constkk3153 Месяц назад
Спасибо за Ваши уроки. Самые простые объяснения без лишнего...
@SurenKhorenyan
@SurenKhorenyan Месяц назад
Пожалуйста! Рад, что вам нравится
@nintek
@nintek 11 месяцев назад
Урок шикарный! Мне, как новичку не совсем понятны все эти взаимоотношения, было бы классно увидеть схему на бумаге, пойду чертить )
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Класс! Если что-то удалось начертить, скидывайте фото в чат в Телеграм 🙂
@simforum
@simforum 11 месяцев назад
Ещё раз спасибо за интересный материал!!! Авторизация очень интересна ))) Будет классно, если получится осветить и эту тему 🤝 Особенно ценна информация о том, как лучше делать в реальной работе (а не в учебных примерах), а как нет. Способов решить задачу много, но бывает сложно понять, какой лучше выбрать. Очень мало информации об этом. А инфоциган, которые по официальным докам нагенерили видео - много))) Было бы здорово, если бы Вам удалось больше такой информации добавлять в видео. Прямо вот не фундаментальные сравнения, а просто обогатить то, о чем рассказываете. Хотя, надеюсь, и в текущих видео "рафинированных" примеров немного, а больше Ваш личные рабочие решения и кейсы ))
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Пожалуйста! Спасибо и вам Угу, авторизацию давно просят, я готовлю сценарий. Там точно больше одного и даже больше двух роликов получится, довольно объемная тема. Примеры все так или иначе связаны с реальной работой. Но, понятное дело, приходится их сильно упрощать, чтобы влезало в один ролик
@aleksei_bauman
@aleksei_bauman 2 месяца назад
Бро, спасибо тебе! На 0,75Х слушаю, чтобы ещё лучше усвоить материал! Скоро смогу слушать в 1х. Это не троллинг, правда топовые видео
@SurenKhorenyan
@SurenKhorenyan 2 месяца назад
@@aleksei_bauman круто, пожалуйста! Да, в новых видео говорю медленнее 😅
@ДмитрийШадрин-у1ф
@ДмитрийШадрин-у1ф 11 месяцев назад
Отличный контент, спасибо тебе Сурен за такое детальное объяснение этой непростой темы👍
@SurenKhorenyan
@SurenKhorenyan 10 месяцев назад
Класс, пожалуйста! Очень приятно 😊 Рад трудиться 💪
@asadhimself
@asadhimself 8 месяцев назад
идеальный нейминг функций)) спасибо за столь кропотливую работу
@SurenKhorenyan
@SurenKhorenyan 8 месяцев назад
Кайф, пожалуйста!
@r_batyr
@r_batyr 8 месяцев назад
Спасибо за урок! Почерпнул для себя много нового!
@SurenKhorenyan
@SurenKhorenyan 8 месяцев назад
Пожалуйста! Рад, что вышло полезно!
@lifestyletv139
@lifestyletv139 Год назад
Огонь,супер!
@SurenKhorenyan
@SurenKhorenyan Год назад
😊😊😊
@ufc_uz6
@ufc_uz6 8 месяцев назад
Спасибо вам, всегда у вас есть что то нового
@SurenKhorenyan
@SurenKhorenyan 8 месяцев назад
Пожалуйста!
@cronosnoname4038
@cronosnoname4038 8 месяцев назад
Супер , спасибо за видео 👍В видео вроде это не упоминалось, но дополню что правило хорошего тона, удалять автоматически сгененрированные алембиком коменты из миграции, так в дальнейшем для себя будет понятно , что если коментов нет, то миграция проверялась глазами, если коменты остались, то видимо забыл взглянуть на нее)
@SurenKhorenyan
@SurenKhorenyan 8 месяцев назад
Пожалуйста! О, хорошее дополнение. Мы так обычно не делаем, возьму на заметку
@ZhuraHere
@ZhuraHere 6 месяцев назад
Спасибо большое за материал! Очень понятно и подробно рассказал расписал!)
@SurenKhorenyan
@SurenKhorenyan 6 месяцев назад
Кайф, пожалуйста! Рад, что вам понравилось 😊
@ИльяАрсеньев-ъ1ч
@ИльяАрсеньев-ъ1ч 3 месяца назад
Спасибо! Просто топ подача! Разжевал, проказал, все ясно понятно (кроме "*columns:" в UniqueConstraint( *columns:'tool_id', 'date_id', name = 'unique_tool_dste', )
@SurenKhorenyan
@SurenKhorenyan 3 месяца назад
Пожалуйста! Рад, что вам понравилось! "*columns:" добавляет PyCharm для понимания, что мы туда закидываем, этого текста в коде на самом деле нет. можно выключить подсказку в настройках
@ИльяАрсеньев-ъ1ч
@ИльяАрсеньев-ъ1ч 3 месяца назад
c "*columns:" разобрался. видимо это IDE подсказывает просто, что далее идет последовательность позиционных аргументов, до первого именованного.
@SurenKhorenyan
@SurenKhorenyan 3 месяца назад
@@ИльяАрсеньев-ъ1ч да, всё верно. Не совсем до именованного, но в целом да. Это просто визуальное отображение, реально в коде это не написано
@romantretyakov6243
@romantretyakov6243 Год назад
Как же вовремя появился этот ролик ) Как всегда очень подробно, спасибо!
@SurenKhorenyan
@SurenKhorenyan Год назад
Класс, рад помочь! Пожалуйста!
@romantretyakov6243
@romantretyakov6243 Год назад
Возник один вопрос по поводу joinload и selectinload, можно ли использовать order_by по присоединяемой таблице? @@SurenKhorenyan
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
привет. сори, в ютубе сложно найти неотвеченные комменты, только сейчас вас заметил. для более быстрого общения пишите в телеграм чат (в описании тг канала ссылка) по коду: я бы попробовал сделать joinedload(User.addresses).order_by, а если так не прокатит, тогда на модели можно сортировку по умолчанию указать: docs.sqlalchemy.org/en/20/orm/relationship_api.html#sqlalchemy.orm.relationship.params.order_by , будет примерно так: `addresses = relationship("Address", backref="user", lazy="joined", order_by="Address.city")`, а в обратную сторону так: `... order_by="desc(Address.city)"`. да, прямо внутри строчки
@romantretyakov6243
@romantretyakov6243 11 месяцев назад
Лучше поздно, чем никогда ) Тем более, что информации таким нюансам крайне мало. Спасибо за совет, попробую с моделью. С joinedload(User.addresses).order_by я уже пытался - не вышло@@SurenKhorenyan
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
@@romantretyakov6243 тогда надо указывать по умолчанию в relationship Может быть ещё есть способы, но наизусть не знаю
@ДинаСеменова-ъ1у
Класс! Очень бы хотелось видео про аутентификацию и авторизацию в FastAPI
@SurenKhorenyan
@SurenKhorenyan Год назад
Обязательно будет 😊 сейчас пару выпусков ещё посмотрим на то, как это всё отображать на странице, и сделаем аутентификацию и авторизацию
@inethak
@inethak 9 дней назад
16:30 это уже не метатаблица получается для связей, это что-то из разряда order_list. туда бы досыпать стоимость товара на время создания заказа, и м.б. доп инфу по скидкам
@SurenKhorenyan
@SurenKhorenyan 9 дней назад
@@inethak а это хорошо или плохо?
@EvgenySeliverstov
@EvgenySeliverstov Год назад
спасибо!нереальное количество полезной информации !
@SurenKhorenyan
@SurenKhorenyan Год назад
Пожалуйста! Рад, что было полезно 😊
@ocean6305
@ocean6305 Год назад
Сурен, спасибо за твою работу, много полезного для себя открываю из твоих видео. Недавно наткнулся на твою лекцию по json:api, довольно познавательно, но конечно хотельсь бы больше практических примеров построения, может что то подскажешь? Хотим попробовать организовать сервис по этой спеке в связке с fastapi. Есть ли какие то библиотеки для облегчения этой задачи?
@SurenKhorenyan
@SurenKhorenyan Год назад
Привет! Я сейчас веду активную разработку такой библиотеки, нам по работе было нужно github.com/mts-ai/FastAPI-JSONAPI Там есть подробная дока с примерами
@ocean6305
@ocean6305 Год назад
@@SurenKhorenyan У меня как раз было открыто на соседней вкладке, даж не знал что твой проект. Тогда сразу репорт скину в первоисточник) При старте минимального примера на 3.12 ошибка: ImportError: cannot import name 'ModelMetaclass' from 'pydantic.main'
@SurenKhorenyan
@SurenKhorenyan Год назад
@@ocean6305 ещё не адаптировали под pydantic v2 😪 пока только в планах
@belphegor6979
@belphegor6979 2 месяца назад
Просто бомбезное видео!
@SurenKhorenyan
@SurenKhorenyan 2 месяца назад
Кайф, спасибо! Очень приятно 🥰
@CounterSuny
@CounterSuny 6 месяцев назад
Добавление айдишника в связующей таблице, для создания связи многие ко многим, избыточно, т.к. уже есть составной первичный ключ, что может привести к аномалиям вставки\удаления\добавления. А так, всё классно!
@SurenKhorenyan
@SurenKhorenyan 6 месяцев назад
Я пока не встречал ни одной ситуации, когда наличие выделенного первичного ключа помешало, зато встречал много ситуаций, когда отсутствие первичного ключа приводило к сложностям или даже доходило до полной остановки разработки до момента добавления отдельного первичного ключа. Так что придерживаюсь стороны добавления pk безусловно
@maksimvlaskin7305
@maksimvlaskin7305 11 месяцев назад
Сурен , спасибо за ваш труд! Скажите, а почему не используете в relationship параметр "backref" вместо "back_populates" Ведь как я понимаю "backref" можно прописать только в одной из связываемых моделей и связь будет. Прописываете "back_populates" явно для читаемости кода? Или есть какие-то причины, особенности?
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Привет! Пожалуйста! Мне больше нравится `back_populates`, так как это более явно, чем `backref`. Чтобы с двух сторон всё указать. Ведь явное лучше, чем неявное
@vasopython1547
@vasopython1547 4 месяца назад
подача пушка спасибо большое
@SurenKhorenyan
@SurenKhorenyan 4 месяца назад
Крутяк, пожалуйста! Приятно 😊
@Evgenybabenko
@Evgenybabenko 7 месяцев назад
Очень здорово! Хотелось бы скачать код посмотреть, чтобы лучше вникнуть.
@SurenKhorenyan
@SurenKhorenyan 7 месяцев назад
Отличное желание! Это хорошее дело. В описании каждого ролика ссылка на код
@arseniynikonov8967
@arseniynikonov8967 Год назад
Было бы интересно посмотреть на реализацию собственной авторизации и работы с юзерами и на библиотеку fastapi_users
@SurenKhorenyan
@SurenKhorenyan Год назад
Совсем целиком свою авторизацию, наверное, не буду, но точно покажу как делать это при помощи различных дополнительных инструментов
@ЕвгенийЮрченко-с1ф
@ЕвгенийЮрченко-с1ф 10 месяцев назад
А свою реализацию самого fast-api тебе показать?)
@SurenKhorenyan
@SurenKhorenyan 10 месяцев назад
@@ЕвгенийЮрченко-с1ф сам FastAPI основан на Starlette, довешивая сверху pydantic 🙂
@Фома-ж7я
@Фома-ж7я 3 месяца назад
Объяснения отличные, спасибо. Правда у меня, как у 1сника, небольшой ступор от заказов и связи многие ко многим. Когда делал пет-проект на джанге, то делал как принято в 1С: таблица заказов и связанную с ней 1 ко многим таблицу строк табличной части заказа, где указывался товар, количество, цена, сумма, и ссылка на заказ. Интересно, какой вариант предпочтительнее.
@SurenKhorenyan
@SurenKhorenyan 3 месяца назад
Пожалуйста! Ооо любопытно! Я бы обсудил детали. Приходите в чат в телеграм, показывайте как делали. Возможно, мне стоит такой вариант тоже показать в роликах 🙂 А может быть это примерно то же самое, просто отображение немного другое
@maksimvlaskin7305
@maksimvlaskin7305 11 месяцев назад
Если когда-нибудь будет ролик по авторизации. Пожалуйста, затроньте тему как правильно обновлять jwt access token на основе refresh token. Все лепят по своему. Спасибо!
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Обязательно будет по авторизации, про работу с jwt тоже расскажу Пожалуйста! И вам спасибо 😊
@semolinacode
@semolinacode 10 месяцев назад
Очень хороший урок, спасибо!
@SurenKhorenyan
@SurenKhorenyan 10 месяцев назад
Кайф, пожалуйста!
@ai_h8_you
@ai_h8_you Год назад
круто и подробно! спасибо! с нетерпением буду ждать развитие проекта! что дальше в планах?
@SurenKhorenyan
@SurenKhorenyan Год назад
Пожалуйста! Рад, что понравилось Дальше покажу, как это всё использовать в API, прикрутим вход пользователя, посмотрим на шаблоны
@ВикторГлухов-р3ь
@@SurenKhorenyan вау, круто!
@SurenKhorenyan
@SurenKhorenyan Год назад
@@ВикторГлухов-р3ь☺
@AlexMuller45
@AlexMuller45 11 месяцев назад
Спасибо за Ваш труд, про авторизацию было бы интересно посмотреть
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Спасибо и вам! Про авторизацию обязательно будет в одном из следующих видео
@twenty1th
@twenty1th 11 месяцев назад
Отличное видео. Спасибо
@SurenKhorenyan
@SurenKhorenyan 11 месяцев назад
Пожалуйста!
@andrewkuzmin4400
@andrewkuzmin4400 9 месяцев назад
Наверное все это следовало делать через тесты с pytests, а так получилась какая-то оторванная от проекта лишняя сущность, которая по сути выполняет функцию тестирования с дописыванием кода самого проекта в процессе.
@SurenKhorenyan
@SurenKhorenyan 9 месяцев назад
возможно, но тесты мы ещё не разбирали
@AlexandrSpirit
@AlexandrSpirit Год назад
Нового для себя не услышал. Но тема раскрыта хорошо. Так держать! Спасибо Было бы здорово написать не сложное приложение, типа магазина, с использованием микросервисов на паттерне SAGA или 2pc
@SurenKhorenyan
@SurenKhorenyan Год назад
Пожалуйста! И вам спасибо Угу, тема интернет-магазина маячит, надо её раскрыть. А вот рассказывать про микросервисную архитектуру пока не думал. Спасибо за подскаку! Возьму на заметку
@krushovice77
@krushovice77 4 месяца назад
Привет! Подскажи, а добавление паpаметра lazy=selectin в связи чем чревато?
@SurenKhorenyan
@SurenKhorenyan 4 месяца назад
Это правило по загрузке данных, как вы будете из базы эти связанные сущности получать
@krushovice77
@krushovice77 4 месяца назад
@@SurenKhorenyan я всегда в своих проектах добавляю этот параметр,чтобы доступ был к связанным сущностям. Вот, пытаюсь разобраться, считается ли это хорошей практикой или же лучше не лениться)
@SurenKhorenyan
@SurenKhorenyan 4 месяца назад
@@krushovice77 если я правильно понимаю работу lazy='selectin', то при каждом запросе сущности будут подтягиваться связанные сущности. зачастую это не нужно, так что я бы так не делал. Подргужать надо при необходимости
@awesomeex5821
@awesomeex5821 4 месяца назад
подскажите как добавить подсказки в терминале? когда вы пишете alembic revision вам подсказывает продолжение
@SurenKhorenyan
@SurenKhorenyan 4 месяца назад
Здравствуйте! На канале есть ролик про настройку терминала: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-9tnwovsybWg.html
@vitmih380
@vitmih380 Год назад
Когда лекторы говорят, что в MySQL или в MariaDB пoявилась поддержка JSON в ПОСЛЕДНИХ версиях, они спали десяток - полтора десятка последних лет? Этой фиче в указанных БД уже тыщу лет
@SurenKhorenyan
@SurenKhorenyan Год назад
Я думаю, тут дело привычки. Просто когда-то это было "вот недавно появилось", и так закрепилось в голове. У меня и аннотации типов в Python тоже совсем недавно появились 🙂 а это ж лет 8 назад было
@AlexMuller45
@AlexMuller45 6 месяцев назад
Добрый день, может не в тему, но больше особо негде спросить, а мануалы по SQLAlchemy теперь только через VPN смотреть можно?
@SurenKhorenyan
@SurenKhorenyan 6 месяцев назад
Здравствуйте. Вы про какие? У меня открывается нормально docs.sqlalchemy.org/en/20/changelog/migration_20.html#migration-orm-usage
@AlexMuller45
@AlexMuller45 6 месяцев назад
@@SurenKhorenyan видимо локальная проблема, буду искать решение, спасибо
@SurenKhorenyan
@SurenKhorenyan 6 месяцев назад
@@AlexMuller45 да не за что. Удачи
@justyar5781
@justyar5781 Год назад
Лучший!
@SurenKhorenyan
@SurenKhorenyan Год назад
Спасибо большое! Очень приятно
@ЕвгенийПопов-е9ъ
а зачем добавлять id в промежуточную таблицу order_producr, если в Base уже есть id?
@SurenKhorenyan
@SurenKhorenyan Год назад
вы абсолютно правы. я тоже на монтаже это заметил. просто в момент записи голова чуть более занята, и не всегда замечаю такие ошибки
@oleksandr7201
@oleksandr7201 Год назад
Планируется ли в последующих видео рассмотрение авторизации с помощью гугл или фейсбук аккаунтов? В русскоязычном сегменте практически нет материалов по данной теме.
@SurenKhorenyan
@SurenKhorenyan Год назад
думаю, OAuth рассмотрим (вход через гугл и тд), но попозже, сначала просто вход по логинпаролю
@user-fm1552
@user-fm1552 9 месяцев назад
поле id в таблицах всегда в самом конце, т.к. в миграции имеет тип sa.PrimaryKeyConstraint('id') , а у sqlalchemy приоритет для типа sa.Column выше, потому сначала идут эти поля при создании таблицы, а почему оно не создает в миграции поле id как и остальные с типом sa.Column ? можно ли как-то поднять id вверх, что бы оно шло первым ?
@SurenKhorenyan
@SurenKhorenyan 9 месяцев назад
Для таблицы это не имеет значения. Но если вам важен порядок отображения, то когда вы проверяете вручную миграцию, которая сгенерирована автоматически, то передвиньте добавление колонки в самое начало. Это надо сделать до применения миграции
@user-fm1552
@user-fm1552 9 месяцев назад
@@SurenKhorenyan , я тоже сразу так подумал, что это поможет, но нет, здесь дело в приоритете orm, она всегда сначала создает колонки, которые в миграции обозначены - sa.Column , а потом уже остальное, а поле id не указано, как sa.Column, поэтому и добавляется после всех созданных колонок с sa.Column, здесь нужно решать как-то редактированием в модели, а вот как, пока не знаю ) если у вас получится - поделитесь, пжлста
@SurenKhorenyan
@SurenKhorenyan 9 месяцев назад
@@user-fm1552 почему же? Берём вот эту строчку github.com/mahenzon/micro-shop/blob/7cee66248079513cbfc06b01d5a055954c92764a/alembic/versions/2023_09_03_1832-c9e562f01355_create_products_table.py#L28 И двигаем на место над созданием name. И всё
@user-fm1552
@user-fm1552 9 месяцев назад
@@SurenKhorenyan , да, вы правы !!! моя невнимательность... я подымал вверх не ту колонку в миграционном файле ) спсб !!! но все же интересно, почему оно сразу не указывает колонку id первой, ведь в исходной модели сначала перечитывается базовая модель и по всей логики колонка id должна быть первой в миграционном файле
@SurenKhorenyan
@SurenKhorenyan 9 месяцев назад
​@@user-fm1552 отлично. хорошо, что удалось разобраться. так происходит потому, что в базовом классе объявлена колонка id, а остальные на текущей модели. По MRO (method resolution order) поиск свойств идёт сначала на текущем классе, потом на родителе, потом на родителе родителя.. поэтому до айди очередь доходит последней
@ВикторГлухов-р3ь
супер!!
@SurenKhorenyan
@SurenKhorenyan Год назад
спасибо ☺️
Далее