Kurs języka Python Wykład 7.

advertisement
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
Download