Я создаю библиотеку базы данных для своего приложения с помощью sqlite3 как основа. Я хочу структурировать его как так:
db/ __init__.py users.py blah.py etc.py
Таким образом, я сделал бы это в Python:
import db
db.users.create('username', 'password')
Я болею аналитическим параличом (о нет!) о том, как обработать соединение с базой данных. Я действительно не хочу использовать классы в этих модулях, действительно не кажется уместным смочь создать набор "пользовательских" объектов, которые могут все управлять той же базой данных теми же способами - настолько наследовавшееся соединение является остановкой.
Если у меня есть одно глобальное соединение с базой данных, которую все модули используют и затем помещают это в каждый модуль:
#users.py
from db_stuff import connection
Или я должен создать новое соединение для каждого модуля и поддержать это?
Или я должен создать новое соединение для каждой транзакции?
Как эти соединения с базой данных, как предполагается, используются? То же идет для объектов курсора: я создаю новый курсор для каждой транзакции? Создать всего один для каждого соединения с базой данных?
Нет, не распределять соединение по нескольким модулям - это плохой дизайн. Один класс должен обрабатывать соединение с БД и предоставлять услуги другим классам / модулям в вашем приложении.
Это не отличается от принципов хорошего дизайна, не связанных с БД. Соединение - это глобальный ресурс. Совместное использование этого ресурса несколькими модулями сродни тому, что глобальная переменная доступна из многих мест - что по умолчанию плохо (если у вас нет веской причины, но у вас ее нет). Инкапсулируйте глобальный ресурс в класс для его обработки.
Я знаю, что это на самом деле не отвечает на фактический вопрос, который вы задали, но настоящий ответ заключается в том, что вам, вероятно, не следует реализовывать свой собственный пакет базы данных. Вероятно, вам следует использовать существующий (например, SQLALchemy), а затем использовать любой шаблон, стандартный для этой библиотеки.
Если вы действительно хотите действовать самостоятельно, лучший подход будет зависеть от множества факторов, например Уверен ли, что проекту когда-либо понадобится подключение только к одной базе данных?
Если это довольно простое приложение, я думаю, что импорт глобального объекта подключения, вероятно, будет лучшим решением. Вы всегда можете заменить его на пул соединений за кулисами и т. Д.