2010-05-18 3 views
5

Я создаю библиотеку базы данных для своего приложения, используя sqlite3 в качестве базы. Я хочу, чтобы структурировать следующим образом:Как создать простой пакет базы данных для моего приложения python?

 
db/ 
    __init__.py 
    users.py 
    blah.py 
    etc.py  

Так что я хотел бы сделать это в Python:

import db 
db.users.create('username', 'password') 

Я страдаю паралич анализа (ой нет!) О том, как обрабатывать соединения с базой данных. Я действительно не хочу использовать классы в этих модулях, на самом деле не представляется целесообразным создавать кучу «пользователей», которые могут управлять одной и той же базой данных одинаково - так что наследование соединения нет.

Если у меня есть одно глобальное подключение к базе данных, которые используют все модули, а затем поместить его в каждом модуле:

#users.py 
from db_stuff import connection 

Или я должен создать новое соединение для каждого модуля и держать, что жив?

Или мне нужно создать новое соединение для каждой транзакции?

Как предполагается использовать эти подключения к базе данных? То же самое касается объектов курсора: создаю ли я новый курсор для каждой транзакции? Создать только один для каждого подключения к базе данных?

ответ

4

Нет, не распространяйте соединение по нескольким модулям - это плохой дизайн. Попросите один класс обрабатывать соединение с БД и предоставлять услуги другим классам/модулям в вашем приложении.

Это не отличается от принципов хорошего дизайна, отличных от DB. Соединение является глобальным ресурсом. Обмен этим ресурсом по многим модулям сродни наличию глобальной переменной, доступной из многих мест - по умолчанию - плохая вещь (если у вас нет очень веской причины, но вы этого не делаете). Инкапсулируйте глобальный ресурс в классе для его обработки.

+0

очень изящное выражение слишком часто игнорируемого предписания. – msw

+0

, так что у вас есть глобальное соединение, но оберните его в класс? Это не похоже на одно глобальное соединение, но вставка его в модуль ... Нехорошо, чтобы каждый модуль начал свои собственные подключения? –

+0

После некоторого чтения выяснилось, что два подключения к одной базе данных работают не так хорошо:/ –

3

Я знаю, что это действительно не отвечает на реальный вопрос, который вы задали, но реальный ответ заключается в том, что вы, вероятно, не должны реализовывать свой собственный пакет базы данных. Вероятно, вы должны использовать существующий (например, SQLALchemy), а затем использовать любой шаблон, стандартный для этой библиотеки.

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

Если это довольно простое приложение, я думаю, что импорт глобального объекта соединения, вероятно, является способом выхода. Вы всегда можете поменять место для пула соединений за кулисами и т. Д.

+0

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

+0

+1 для предложения SQLAlchemy, даже для простого приложения, это может быть хорошей идеей, он делает запись запросов к базе данных намного более Pythonic :) Он также внутренне реализует объединение пулов и обработку сеанса с привязкой к потокам, поэтому вам не нужно беспокоиться об этих вещах. Просто сделайте сеанс, когда он вам нужен, и он будет обрабатывать детали и оптимизацию. – wump

 Смежные вопросы

  • Нет связанных вопросов^_^