2010-05-18 7 views
5

Buduję bibliotekę baz danych dla mojej aplikacji, używając bazy sqlite3 jako bazy. Chcę zorganizować je tak:Jak zbudować prosty pakiet bazy danych dla mojej aplikacji Pythona?

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

Więc chciałbym to zrobić w Pythonie:

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

mam cierpi analizy paraliż (oh no!) O tym, jak obsługiwać połączenia z bazą danych. Tak naprawdę nie chcę używać klas w tych modułach, nie wydaje się właściwe, aby móc tworzyć grupę obiektów "użytkowników", które mogą manipulować tą samą bazą danych w ten sam sposób - więc dziedziczenie połączenia jest nie ma wyjścia.

powinienem mieć jeden globalnego połączenia z bazą danych, że wszystkie moduły użyć, a następnie umieścić to w każdym module:

#users.py 
from db_stuff import connection 

Albo należy utworzyć nowego połączenia dla każdego modułu i utrzymywać, że żyje?

Czy powinienem utworzyć nowe połączenie dla każdej transakcji?

W jaki sposób należy korzystać z tych połączeń z bazą danych? To samo dotyczy obiektów kursora: Czy dla każdej transakcji utworzę nowy kursor? Utworzyć po jednym dla każdego połączenia z bazą danych?

Odpowiedz

4

Nie, nie rozlewaj połączenia na kilka modułów - jest to zły projekt. Niech jedna klasa obsługuje połączenie DB i zapewnia usługi innym klasom/modułom w aplikacji.

Nie różni się to od zasad dobrego projektowania powiązanych z DB. Połączenie jest zasobem globalnym. Udostępnianie tego zasobu w wielu modułach jest podobne do posiadania globalnej zmiennej dostępnej z wielu miejsc - domyślnie jest to coś złego (chyba że masz bardzo ważny powód, ale ty nie). Osłoń globalny zasób w klasie, aby go obsłużyć.

+0

bardzo elegancki wyraz zbyt często ignorowanej przykazania. – msw

+0

więc masz jedno połączenie globalne, ale zawijacie je w klasę? To nie wydaje się dużo różnić od posiadania jednego globalnego połączenia, ale umieszczenia go w module ... Czy to źle, że każdy moduł rozpoczyna swoje własne połączenia? –

+0

nevermind, po pewnym przeczytaniu okazało się, że dwa połączenia z tą samą bazą danych nie działają tak dobrze:/ –

3

Wiem, że tak naprawdę nie odpowiada na pytanie, które zadałeś, ale prawdziwa odpowiedź brzmi, że prawdopodobnie nie powinieneś zaimplementować własnego pakietu baz danych. Powinieneś prawdopodobnie użyć istniejącego (np. SQLALchemy), a następnie użyć dowolnego wzoru standardowego dla tej biblioteki.

Jeśli naprawdę chcesz się postarać, najlepsze podejście będzie zależeć od wielu czynników, np. Czy projekt zawsze będzie wymagał połączenia z jedną bazą danych?

Jeśli jest to dość prosta aplikacja, myślę, że zaimportowanie globalnego obiektu połączenia jest prawdopodobnie drogą do zrobienia. Zawsze można go zamienić na pulę połączeń za kulisami itp.

+0

Jest to dość prosta aplikacja, wszystko, co robi ten pakiet, to podawanie nazw kilku zapytań. Po prostu nie byłem pewien * kiedy * do tworzenia połączeń z bazami danych. –

+0

+1 za sugerowanie SQLAlchemy, nawet dla prostej aplikacji może to być dobry pomysł, sprawia, że ​​pisanie zapytań do bazy danych staje się o wiele bardziej Pythoniczne :) To również wewnętrznie implementuje buforowanie połączeń i obsługę wątków w zakresie wątków, dzięki czemu nie musisz martw się o te rzeczy. Po prostu utwórz sesję, gdy jej potrzebujesz i poradzisz sobie z trudnymi szczegółami i optymalizacjami. – wump