Что такое хороший способ обработки объектов базы данных в классах Python? - PullRequest
2 голосов
/ 01 марта 2010

Должен ли я обращаться к глобальному объекту БД напрямую из методов каждого класса? Или из каждого метода я должен создать экземпляр объекта db?

Один из моих объектов базы данных изменяется в зависимости от идентификатора информации, к которой осуществляется доступ, поэтому он создается с помощью функции connectToDatabase (id). Должен ли я сделать это глобальной функцией, вернуть ли ей объект базы данных и создать его экземпляр из каждого метода или что-то еще?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

В этом случае, как и во многих других, я предпочитаю внедрение зависимостей : ваш класс (например, в __init__) принимает соединение с БД в качестве аргумента.

Это делает тестирование проще и понятнее, позволяет переключать стратегии по мере необходимости (например, переходить к стратегии «пул соединений с БД», если вы обнаружите, что в противном случае вы делаете слишком много соединений с БД одновременно), и распределяет обязанности более точно и гибко.

В целом, я думаю, что Dependency Injection - это, вероятно, самый важный шаблон проектирования, который не был указан в великой книге «Банда 4»! -)

1 голос
/ 01 марта 2010

SQLAlchemy предлагает, чтобы функция, которая создает сеанс, была глобальной.

http://www.sqlalchemy.org/docs/reference/orm/sessions.html#sqlalchemy.orm.sessionmaker

Предполагается, что сеансмейкер () функция вызывается в глобальном сфера применения, а также возвращаемый класс будет доступен остальная часть приложения в качестве один класс используется для создания экземпляра сессий.

...