По сути - как и везде. Пример- У бизнесс логики не должно быть зависимостей от конкретных реализаций. Сегодня у вас все хранится в постгрес а завтра в монге. Инверсия зависимостей позволяет более менее безболезненно совершить такой переезд, так как слой бизнесс логики понятия не имеет где вы храните данные. Ниже накидал грубый но вроде понятный кусок кода. Есть некая сущность блог, к которой можно добавлять пользователей и смотреть их. Блог должен откуда то тянуть данные и где то хранить их. Мы создаем некий интерфейс
DBInterface
,который имеет стандартные методы добавить/удалить данные. Далее создаем класс
SQLdb
который реализует этот интерфейс.
В самом классе блога мы реализуем функции получения/добавления пользователей без привязки к конкретной системе хранения: просто создаем экземпляр класса
SQLdb
и экземпляр класса
Blog
, передавая туда sqldb. Когда мы захотим переехать на монгу - нам не надо будет трогать класс блога. Мы всего лишь реализуем класс
Mongodb
для новой базы и будем опрокидывать его в блог вместо sqldb. Итог - блог не зависит от системы хранения вообще.
Пример сильно упрощен и утрирован, но для понимания как оно работает думаю сойдет)
from abc import ABC, abstractmethod
import random
class DBInterface(ABC):
@abstractmethod
def insert(self, data):
pass
@abstractmethod
def get(self, id):
pass
class SQLdb(DBInterface):
def insert(self, data):
print(f"inserted {data} from mysql")
return random.randint(0, 100)
def get(self, id):
print(f"get user {id} data from mysql")
return {'id': id, "data": "some_data"}
class Mongodb(DBInterface):
def insert(self, data):
print(f"inserted {data} from mongo")
return random.randint(0, 100)
def get(self, id):
print(f"get user {id} data from mongo")
return {'id': id, "data": "some_data"}
class Blog:
def __init__(self, db, blog_id):
self.db = db
self.blog_id = blog_id
def add_user(self, name):
self.db.insert(name)
def get_users(self):
return self.db.get(self.blog_id)
if __name__ == '__main__':
sql_db = SQLdb()
mongo_db = Mongodb()
blog_with_sql = Blog(db=sql_db, blog_id=1)
blog_with_sql.add_user("test") # Выведет inserted test from mysql
blog_with_mongo = Blog(db=mongo_db, blog_id=1)
blog_with_mongo.add_user("test") # Выведет inserted test from mongo