Kurs języka Python Wykład 7. Bazy danych: ● Bazy danych typu dbm ● Bazy danych w architekturze klient-serwer Trójwarstwowy model aplikacji Interfejs użytkownika Logika aplikacji Baza danych Dostępne bazy danych Klient-serwer (SQL) Dbm Oracle dbm GNU's dbm DB/2 SQLite MySQL PostgreSQL Berkeley DB Bazy danych typu Dbm Database manager: ● Dane przechowywane są w pliku, który przypomina słownik ● Dostęp do danych jest po kluczu ● Wartość zwykle może być tylko napisem ● Implementacja: zwykle tablice haszujące i b-drzewa ● Brak odrębnego serwera, dane pamiętane są w lokalnym pliku Dostępne moduły dbm - (n)dbm ● gdbm – GNU's dbm ● bsddbm – Berkeley DBM ● hashdb ● Dostęp do BD import anydbm db = anydbm.open('/tmp/plik', 'c') db['jeden'] = 'one' db['trzy'] = 'three' del db['trzy'] db.close() Przeglądanie db = anydbm.open('/tmp/plik') for k, v in db.iteritems(): print k, '\t', v db.close() Wady Działa tylko dla niewielkich danych Powód db.iteritems() Inny sposób przetwarzania Dwie metody obiektu db: ● first() ● next() Zwracają parę (klucz, wartość) Inny sposób przetwarzania, cd db = anydbm.open('/tmp/plik') elem = db.first() while elem: try: elem = db.next() except KeyError: break db.close() dbm zachowuje się jak słownik! if 'klucz' in db: print db['klucz'] # gdy nie ma klucza, KeyError Więc skoro to słownik: for x in db: print x, db[x] Berkeley DB moduł bsddb Właściwości: ● Transakcje ● Replikacja ● Blokowanie rekordów Typy plików tablica haszująca import bsddb db = bsddb.hashopen('dbm', 'c') ... Typy plików b-drzewa import bsddb db = bsddb.btopen('dbm', 'c') ... B-drzewa Wartości zwracane są w kolejności alfabetycznej Numerowane rekordy Kluczami są liczby naturalne (numery rekordów) ● Numery zaczynają się od 1 ● ! Inne pożyteczne metody last() ● previous() ● sync() ● has_key(klucz) ● Ciekawostka import bsddb bsddb.hashopen(None) bsddb.btopen(None) bsddb.rnopen(None) Do czego używa się Berkeley DB OpenLDAP ● Subversion ● Spamassasin ● KDevelop ● A jak przechowywać obiekty? Pakiet shelve: pliki są słownikami ● kluczami są stringi, warościami: obiekty (również listy itp) ● sync() ● Przykład import shelve db = shelve.open('dane.db') db['lista'] = [2,3,5,7,11] db.close() Serwery baz danych Oracle ● DB/2 ● MySQL ● PostgreSQL ● MS SQL ● ... ● Python Database API Specification Zunifikowany interfejs dostępu do różnych silników relacyjnych baz danych ● Wersja 1.0 i 2.0 ● Otwarcie połączenia z bd Funkcja connect('parametry') zwraca obiekt connection. Przykład (MySQL) import MySQLdb db = connect(host='localhost', db='baza_testowa', user='user', passwd='********') Zamknięcie db.close() SQL-owe bazy danych Zapytanie SQL aplikacja Lista wierszy Serwer bazy danych Wysłanie zapytania SQL kursor = db.cursor() kursor.execute('SELECT * FROM Studenci') Odczytanie wyniku row = kursor.fetchrow() while row: print row # lista row = kursor.fetchrow() Atrybuty kursora description: lista opisów poszczególnych kolumn odpowiedzi ● rowcount: liczba wierszy w odpowiedzi lub liczba przetworzonych wierszy (w przypadku INSERT czy UPDATE) ● DB API DB API definiuje także listę wyjątków wraz z zaleceniem, kiedy dany wyjątek jest zgłaszany. SQLite 'Dyskowa' baza danych – nie wymaga zewnętrznego serwera, nie wymaga kontaktu z adminem itp. ● sqlite (lub sqlite3): API do SQLite ● Sqlite implementuje DB API 2.0 ● Przykład import sqlite db = sqlite.connect('/tmp/plik') Założenie tabeli kursor = db.cursor() kursor.execute('''create table Ksiegozbior (Autor text, Tytul text, RokWyd int, cena real)''') kursor.commit() Wstawienie rekordu kursor.execute('''insert into Ksiegozbior values ('Mickiewicz', 'Pan Tadeusz', 2003, 25.5)''') Odczyt danych kursor.execute('SELECT * FROM Ksiegozbior') for row in kursor: print row Ciekawostka db = sqlite.connect(':memory:') KONIEC