Шаблон проектирования Python для абстрагирования доступа к данным: преимущества, недостатки? - PullRequest
0 голосов
/ 07 сентября 2011

Мне было интересно узнать о нескольких способах абстрагирования доступа к хранилищу данных от основного приложения, и небольшой пример: среда IoC кажется излишней, возможно, передавая объект через параметр конструктора (фасад).

Является ли приведенный ниже псевдокод хорошим способом сделать что-то, и как мне заполнить недостающие фрагменты Python?

main.py
    resp = Repository(engine=NoSql)  # can easily switch to nosql???
    resp.save("hello");
    resp.select("hello");

repository.py
class Repository:
    def __init__(self, engine):
        self.engine = engine

    def save(self, str)
        engine.save(str)

    def select(self, str)
        engine.select(str)

nosql.py
class NoSql:
    def save(self, str)
        nosql.save(str)

    def select(self, str)
        nosql.select(str)

mysql.py
class MySql:
    def save(self, str)
        mysql.save(str)

    def select(self, str)
        mysql.select(str)

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Вы собираетесь создать еще один слой ORM.

Вместо того, чтобы тратить много времени на переосмысление этого колеса, узнать о существующем ORM и адаптировать его к выбранному вами ядру базы данных noSQL.

Начните, например, с SQLAlchemy в качестве ORM,может делать все, что вы хотите (и даже больше) для SQL.

Из-за утки Python вы можете изобрести совместимый noSQL ORM или репозиторий ORM или что-то еще, что вы считаете важным.

Однако не изобретайте это колесо с нуля.Прочитайте несколько других реализаций.SQLObject, Django ORM, SQLAlchemy - хорошие места для начала.

1 голос
/ 07 сентября 2011

Я бы сказал, что вышесказанное - не лучший способ сделать это.Потребитель (в данном случае main.py) не должен ничего знать о деталях реализации модели.Я мог бы сохранить пары ключ / значение во внешнем файле конфигурации, который будет использоваться моделью для определения используемого механизма.

0 голосов
/ 07 сентября 2011

Это работоспособное решение, я делал подобные вещи в других проектах.Убедитесь, что вы храните все реализации базы данных в классах базы данных.Главное должно быть в состоянии переключаться между двумя без каких-либо изменений.Если вам нужно вносить изменения в main при переключении, это, вероятно, код, который должен быть в классах Sql.

Я бы сделал Repository базовым классом, из которого унаследованы другие, вместо оболочки.Таким образом, если две реализации имеют идентичный или очень похожий код, вы можете перемещать детали в репозиторий, поэтому вам не нужно дублировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...