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 '{s 01 00 00 002i 02 00 00 00s...' >>> 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.