Którą bazę wybrać? Odpowiedź na to pytanie zależy od kilku czynników. Przede wszystkim należy rozważyć, czy potrzebna nam jest duża wydajność i skalowalność, równoczesny zapis i odczyt, obsługa SQL, transakcje… Jeśli tak – możemy skorzystać z dowiązań do którejś z wydajnych baz danych, takich jak PostgreSQL, Oracle czy DB2. Jeśli nie – wystarczą nam proste bazy danych, takie jak DB. Istnieją też rozwiązania pośrednie, takie jak Gadfly.

Przede wszystkim warto wspomnieć, że… Python też ma swoje DBI. Takim odpowiednikiem DBI jest DB-API, otwarta specyfikacja interfejsów dla baz danych. Obecnie istnieją implementacje dla DB2, gadfly, Informiksa, interbase, Ingresa, JDBC i ODBC, MySQL, mSQL, Oracle, Postgresa i Sybase, choć nie wszystkie moduły zawierają pełną implementację specyfikacji DB-API.
Jeśli nie potrzebna jest nam ogromna baza i związane z nią koszty, warto zastanowić się nad prostymi bazami, które nie posiadają zbyt wielu funkcji, są jednak proste w obsłudze i w niewielkim tylko stopniu obciążają system. Typowym przykładem są niewielkie bazy, zwierające kilkadziesiąt-kilkaset rekordów. Co więcej, bazy te często są już zainstalowane w systemie. Może to być bez znaczenia w przypadku aplikacji serwerowej, ale jeśli projektujemy program przeznaczony do masowego użytku, dodanie wymogu instalacji serwera baz danych może znacznie zawężyć krąg potencjalnych użytkowników [to samo, nota bene, tyczy się też wersji Pythona – w tym wypadku nie ma sensu korzystać z rozszerzeń serii 2.x, lepiej pisać dla 1.52].
Interfejsy dla prostych baz danych są łudząco do siebie podobne. Na początku importujemy moduł odpowiedzialny za obsługę danej bazy:

  import bsddb  import dbm     import gdbm  import dbhash  

Możemy też zaimportować moduł anydbm, odpowiedzialny za automatyczny wybór bazy (jeśli w systemie nie zostanie znaleziona żadna baza, wykorzystana zostanie dumbdb – powolna i nieskomplikowana implemetacja prostej bazy danych). Dodatkowo moduł whichdb zawiera jednoargumentową funkcję wchichdb(), która zwraca łańcuch będący nazwą rodzaju wykorzystywanej bazy.
Następnie otwieramy bazę:

  bz = dbhash.open('mojabaza','c')  

(’r’ – do odczytu; 'w’ – do zapisu, 'c’ – utwórz jesli nie istnieje, 'n’ – utwórz). Po otwarciu bazy możemy odwoływać się do rekordów (niemal) jak do standardowych elementów słownika (nie można bezposrednio odwoływać się do wartości, jedynie do kluczy):

  >>> bz.keys()  []  >>> bz['0'] = "Jerzy"  >>> bz['1'] = "Kazimierz"  >>> bz['2'] = "Wojciech"  >>> bz.keys()  ['0', '2', '1']  >>> for i in bz.keys():  ...     print bz[i]  ...  Jerzy  Wojciech  Kazimierz  >>> bz.close()  

Niestety, powyższe podejście – choć proste – kryje w sobie zasadniczą wadę: wartości i klucze muszą być łańcuchami znakowymi. Aby więc umieścić w wartościach inne obiekty Pythona, musimy skorzystać z modułów takich jak pickle czy marshal. Marshal oferuje funkcję dumps(), zamieniającą obiekt Pythona na łańcuch. Odwrotną czynność wyokonuje loads():

  >>> bz['1'] = 1  Traceback (most recent call last):    File "", line 1, in ?  TypeError: bsddb value type must be string  >>> a = {'1':1,'2':2}  >>> b = marshal.dumps(a)  >>> b  '{s010000002i02000000s...'  >>> bz['1'] = b  >>> f = marshal.loads(bz['1'])  >>> f  {'2': 2, '1': 1}  

Jeśli jesteśmy leniwi, możemy użyć standardowego modułu shelve, który zrobi to dla nas wykorzystując pickle.
Przykładowy skrypt – dodawanie newsów do bazy – można pobrać stąd, a zobaczyć w działaniu tutaj (rezultat – tutaj). Tworzy on bazę danych i dodaje do niej artykuły właśnie przy użyciu shelve. Warto jednak pamietać o jednym: na shelve nie można polegać. Jeśli więcej niż jeden użytkownik ma zapisywać do bazy, trzeba zablokowac plik bazy, a dodatkowo dobrze jest utworzyć kopię bezpieczeństwa (awaria systemu w czasie kiedy baza otwarta jest w trybie do zapisu spowoduje jej uszkodzenie).
Archiwalny news dodany przez użytkownika: arturs.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →