ИСПОЛЬЗУЙ ЭТО С РЕПОЗИТОРИЕМ! ПАТТЕРН СПЕЦИФИКАЦИЯ В ПИТОНЕ
Вставка
- Опубліковано 20 сер 2024
- Андрей Иванов - Питон
Используйте мою ссылку в криптобирже OKEX и получите -10%:
www.okx.com/jo...
Мои курсы на UDEMY: www.udemy.com/....
Пожертвования: www.donational....
Github: github.com/knu...
Telegram канал: t.me/pypapyrus_ru
Другие Видео по Python: www.youtube.co....
Канал на английском языке: www.youtube.co....
Поставьте лайк и подпишитесь!
#Python #Питон #программирование #programming
Классное видео, хоть и знал, но, всё равно интересно было смотреть. Рад что разбираются более продвинутые приёмы, полезно. Спасибо большое
Есть ощущение что автор путает DAO и Repository. Но даже если и так. Взять ту же джангу. Усложнить запрос, например агрегация какая то. И вот мы переизобретаем ORM. А в алхимии вы где будете джоины писать?
Идея про разбор паттернов в работе с бд (да и вообще с кодом, приближенным к реальности) очень хорошая, единственное что показалось, что не до конца разобрал примеры. Имею ввиду не дописал программу как-будто торопился) спасибо за видео, но прошу доделать до конца в плане написания классов и реализации примеров (например не дописал класс с методами __and__ __or__ и переключился на что-то другое)
Просто не нужно использовать Repository для отдачи данных на UI. Repository используют для изменения состояния доменных сущностей. То есть нашли доменную сущность, изменили её состояние, положили в базу данных. Таким образом выборка будет только по id. Поскольку в DDD одну сущность от другой отличают именно по id вы не можете искать сущность по каким-либо другим критериям. А вот для отдачи данных на UI нужно просто напрямую ходить в базу минуя Repository и ORM.
Бывают конечно ситуации, когда вы допустим хотите посчитать средний чек покупателя и затем сохранить это значение в сущность покупателя. Тогда вроде как хочется найти все заказы покупателя по какому-нибудь customerId, но нет в таких ситуациях нужно использовать Domain Service, внутри которого будет обычный прямой запрос в базу данных, который посчитает и вернет средний чек.
А спецификация, это про булеву логику. То есть метод isSatisfied должен возвращать булево значение, а не какой-то иной тип данных. Соответственно его используют, когда нужно взять сущность, которая уже лежит в памяти и проверить удовлетворяет ли она каким-либо бизнес-правилам или нет. Понятно, что любые костыли можно к чему угодно приделать, но всё же, лучше каждый паттерн использовать там где он уместен.
Хорошо, тогда вопрос такой: почему в самой книге по DDD от Эванса паттерн спецификация использовался вместе с репозиторием(и даже SQL)?
@@PythononPapyrusRU Если не трудно, дайте ссылку. Т.к. единственное что там есть про базу данных, это что-то типа "оптимизируйте сами загрузку обьектов из бд в память"
@@PythononPapyrusRU в «Паттерны разработки на Python: TDD, DDD и событийно-ориентированная архитектура» предлагают отдавать данные на UI в обход репозитория.
И так мы медленно изобретеаем mongo запросы...)
Обратите внимание, что все подклассы спецификации, который упомятуны в видео должны быть абстрактными. А потом уже реализация для репозитория, который работает с orm. Или же. Если вдруг мы хотим иметь такого вида спецификации, то делать адаптер для движка, который работает с другими системами хранения данных. Вот представьте, что у нас нет orm, есть CSV. Как мы из репозитория уберем логику отбора записей? Даже если напишем движок, как он поймет контрукцию age_gte=18? Блин, сложно все, когда нет sql))
Исходя из этого вопрос автору, приходилось ли вам работать с репозиториями, не знающие про orm, и как там это дело реализовать
Добрый день, спасибо за видео и объяснение. Возник вопрос по поводу конструкции return {“age__gte”: 18} - это синтаксис django ? Или можно, например, в SQLALCHEMY использовать .? Лучше если скажете, где об этом прочитать .
Спасибо большое
Такое можно в sqlalchemy использовать, но скорее вам нужно будет передавать сам запрос в спецификацию, а после добавлять к нему поля. Могу в одном из видео показать
@@PythononPapyrusRU буду признателен за ещё один пример в видео на примере sqlalchemy
привет недавно столкнулся с такой проблемой то что нужно было сделать под запрос я использовал паттерн Repository и просто внутри добавил метод sub_query() можешь сказать правильно ли я сделал?)
Нуу, тут нужен контекст. Скорее всего нет, потому что этот подзапрос можно вставить в спецификацию
@@PythononPapyrusRU ок понятно а можно ли в repository писать свои сырые запросы не будет ли это нарушение логики или же нужно в спецификацию тоже ложить?
Скорее лучше в спецификации. Можно написать только ту часть запроса в которой нет фильтров WHERE и похожих вещей. Также сами значения из SELECT тоже нельзя
разворотка
А помельче нельзя было, а то слишком хорошо видно...
так нормально ведь видно