Programowanie i projektowanie obiektowe
Przechowywanie obiektów
Paweł Daniluk
Wydział Fizyki
Jesień 2016
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 1 / 61
Przechowywanie danych
Żaden poważny system informatyczny nie może działać bez składowania danych na trwałych nośnikach.
Dane można zapisywać:
w plikach (tekstowych lub binarnych) w relacyjnej bazie danych
na zdalnym serwerze (przy użyciu mniej lub bardziej standardowego protokołu)
Bardzo pożądane są metody pozwalające na zapisywanie o odczytywanie całych obiektów, które występują w systemie. Najlepiej razem z
powiązaniami pomiędzy nimi.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 2 / 61
Python pickle
Serializacja obiektów - za Wikipedią
W programowaniu komputerów proces przekształcania obiektów, tj.
instancji określonych klas, do postaci szeregowej, czyli w strumień bajtów, z zachowaniem aktualnego stanu obiektu. Serializowany obiekt może zostać utrwalony w pliku dyskowym, przesłany do innego procesu lub innego komputera poprzez sieć. Procesem odwrotnym do serializacji jest deserializacja. Proces ten polega na odczytaniu wcześniej zapisanego strumienia danych i odtworzeniu na tej podstawie obiektu klasy wraz z jego stanem bezpośrednio sprzed serializacji.
W Pythonie służy do tego (m. in.) moduł pickle.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 3 / 61
pickle przykład
Serializacja
I n [ 1 ] : c l a s s A : . . . : p a s s . . . :
I n [ 2 ] : a = A ( ) I n [ 3 ] : a . a = 1 I n [ 4 ] : a . b = 2 I n [ 5 ] : i m p o r t p i c k l e
I n [ 6 ] : f = open ( ’ p l i k ’ , ’w ’ ) I n [ 7 ] : p i c k l e . dump ( a , f ) I n [ 8 ] : f . c l o s e ( )
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 4 / 61
pickle przykład
plik
( i__main__
A p0 ( dp1 S ’ a ’ p2 I 1 sS ’ b ’ p3 I 2 s b .
Deserializacja
I n [ 9 ] : f = open ( ’ p l i k ’ , ’ r ’ ) I n [ 1 0 ] : b = p i c k l e . l o a d ( f ) I n [ 1 1 ] : b . __dict__
Out [ 1 1 ] : { ’ a ’ : 1 , ’ b ’ : 2}
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 5 / 61
pickle c.d.
Uwagi
Sieci powiązań pomiędzy obiektami są poprawnie serializowane.
Reprezentacja obiektu nie zawiera opisu klasy.
Python gwarantuje kompatybilność wsteczną z danymi serializowanymi przy pomocy poprzednich wersji.
Nie obejmuje to kwestii zmiany definicji klas w aplikacji.
Działa tylko z Pythonem.
Zastosowania
Zapisywanie danych ad-hoc.
Przesyłanie obiektów przez sieć.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 6 / 61
XML
eXtensible Markup Language
Znaczniki
określają znaczenie podciągów znaków w dokumencie teksty ujęte w nawiasy kątowe <...>
występują w parach – otwierający <...> i zamykający </...>
Zastosowania
Przechowywanie ustrukturyzowanych danych w plikach tekstowych Wymiana danych pomiędzy aplikacjami
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 7 / 61
Tryby dokumentów XML
Dobrze sformowany XML Podejście semistrukturalne Dowolne znaczniki
Brak ustalonego schematu
Ustalony typ dokumentu
Podejście pośrednie pomiędzy schematem semistrukturalnym, a ścisłymi (np. relacyjnym)
Document Type Definition
Specyfikacja dopuszczalnych znaczników Gramatyka zagnieżdżania
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 8 / 61
Dobrze sformowany XML
Przykład
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" y e s " ?>
< e t a t y>
< e t a t>
<nazwa> P r o f e s o r</ nazwa>
<p l a c a _ o d>3000</ p l a c a _ o d>
<p l a c a _ d o>6000</ p l a c a _ d o>
</ e t a t>
< e t a t>
. . .
</ e t a t>
</ e t a t y>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 9 / 61
Dokument ustalony
Dokument bez specyfikacji typu
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" y e s " ?>
Nagłówek
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" no " ?>
<!DOCTYPE typDokumentu SYSTEM " s p e c y f i k a c j a . d t d ">
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 10 / 61
Dokument ustalony c.d.
Przykład
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" no " ?>
<!DOCTYPE E t a t y SYSTEM " e t a t y . d t d ">
< e t a t y>
< e t a t>
<nazwa> P r o f e s o r</ nazwa>
<p l a c a _ o d>3000</ p l a c a _ o d>
<p l a c a _ d o>6000</ p l a c a _ d o>
</ e t a t>
< e t a t>
. . .
</ e t a t>
</ e t a t y>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 11 / 61
Dokument ustalony c.d.
Deklaracja elementu głównego (korzenia) Deklaracje elementów
Deklaracje reguł zagnieżdżania
etaty.dtd
<!DOCTYPE e t a t y [
<!ELEMENT e t a t y ( e t a t ∗ )>
<!ELEMENT e t a t ( nazwa , placa_od , p l a c a _ d o )>
<!ELEMENT nazwa (#PCDATA)>
<!ELEMENT p l a c a _ o d (#PCDATA)>
<!ELEMENT p l a c a _ d o (#PCDATA)>
]>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 12 / 61
Dokument ustalony c.d.
Nazwa typu dokumentu: <!DOCTYPE [...]>
Nazwy dopuszczalnych elementów <!ELEMENT (...)>
Reguły zagnieżdżania dopuszczalnych składowych elementów element (podelement1*, podelement2+, podelement3?,...) Operatory:
I *: 0 lub więcej
I +: 1 lub więcej
I ?: co najwyżej raz
element (#PCDATA)
Typ #PCDATA oznacza dowolny tekst Nie występują typy elementów
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 13 / 61
Przykład
Model relacyjny
Gwiazdy(nazwisko, adres) Filmy(tytul, rok, dlugosc)
GwiazdyW(tytul, rok, nazwiskoGwiazdy)
Dokument DTD
<!DOCTYPE G w i a z d y [
<!ELEMENT g w i a z d y ( g w i a z d a ∗ )>
<!ELEMENT g w i a z d a ( n a z w i s k o , a d r e s +, f i l m y )>
<!ELEMENT n a z w i s k o (#PCDATA)>
<!ELEMENT a d r e s (\#PCDATA)>
<!ELEMENT f i l m y ( f i l m ∗ )>
<!ELEMENT f i l m ( t y t u l , r o k , d l u g o s c )>
<!ELEMENT t y t u l (\#PCDATA)>
<!ELEMENT r o k (\#PCDATA)>
<!ELEMENT d l u g o s c (#PCDATA)>
]>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 14 / 61
Przykładowe dane
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" no " ?>
<!DOCTYPE G w i a z d y SYSTEM " g w i a z d y . d t d ">
<g w i a z d y>
<g w i a z d a>
<n a z w i s k o> C a r r i e F i s c h e r</ n a z w i s k o>
<a d r e s>123 Maple S t .</ a d r e s>
< f i l m y>
< f i l m>
< t y t u l>G w i e z d n e Wojny</ t y t u l>
<r o k>1977</ r o k>
<d l u g o s c>93</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>I m p e r i u m K o n t r a t a k u j e</ t y t u l>
<r o k>1980</ r o k>
<d l u g o s c>96</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>Powrot J e d i</ t y t u l>
<r o k>1983</ r o k>
<d l u g o s c>94</ d l u g o s c>
</ f i l m>
</ f i l m y>
</ g w i a z d a>
<g w i a z d a>
<n a z w i s k o>Mark H a m i l l</ n a z w i s k o>
<a d r e s>456 Oak Rd .</ a d r e s>
<a d r e s>789 P i n e Av .</ a d r e s>
< f i l m y>
< f i l m>
< t y t u l>I m p e r i u m K o n t r a t a k u j e</ t y t u l>
<r o k>1980</ r o k>
<d l u g o s c>96</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>Powrot J e d i</ t y t u l>
<r o k>1983</ r o k>
<d l u g o s c>94</ d l u g o s c>
</ f i l m>
</ f i l m y>
</ g w i a z d a>
</ g w i a z d y>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 15 / 61
Przykładowe dane
<? x m l v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" no " ?>
< ! DOCTYPE G w i a z d y SYSTEM " g w i a z d y . d t d ">
<g w i a z d y>
<g w i a z d a>
<n a z w i s k o> C a r r i e F i s c h e r</ n a z w i s k o>
< a d r e s>123 Maple S t .</ a d r e s>
< f i l m y>
< f i l m>
< t y t u l>G w i e z d n e Wojny</ t y t u l>
<r o k>1 9 7 7</ r o k>
< d l u g o s c>93</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>I m p e r i u m K o n t r a t a k u j e</ t y t u l>
<r o k>1 9 8 0</ r o k>
< d l u g o s c>96</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>P o w r o t J e d i</ t y t u l>
<r o k>1 9 8 3</ r o k>
< d l u g o s c>94</ d l u g o s c>
</ f i l m>
</ f i l m y>
</ g w i a z d a>
<g w i a z d a>
<n a z w i s k o>Mark H a m i l l</ n a z w i s k o>
< a d r e s>456 Oak Rd .</ a d r e s>
< a d r e s>789 P i n e Av .</ a d r e s>
< f i l m y>
< f i l m>
< t y t u l>I m p e r i u m K o n t r a t a k u j e</ t y t u l>
<r o k>1 9 8 0</ r o k>
< d l u g o s c>96</ d l u g o s c>
</ f i l m>
< f i l m>
< t y t u l>P o w r o t J e d i</ t y t u l>
<r o k>1 9 8 3</ r o k>
< d l u g o s c>94</ d l u g o s c>
</ f i l m>
</ f i l m y>
</ g w i a z d a>
</ g w i a z d y>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 16 / 61
Dokument ustalony c.d.
Zagnieżdżanie znaczników nie pozwala przedstawić wszystkich informacji
Atrybuty pozwalają na dodatkowy opis danych Zmniejszenie redundancji
Mogą służyć do powiązania pojedynczej wartości ze znacznikiem Alternatywa dla podznaczników, które są zwykłymi tekstami (#PCDATA)
Składnia
Po deklaracji elementu <!ELEMENT (...)>
<!ATTLIST element ...>
lista atrybutów
I atrybut1
I atrybut2 ID
I atrybut3 IDREF lub IDREFS
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 17 / 61
Atrybuty – przykład
Dokument DTD
<!DOCTYPE Gwiazdy−F i l m y [
<!ELEMENT g w i a z d y −f i l m y ( g w i a z d a ∗ , f i l m ∗ )>
<!ELEMENT g w i a z d a ( n a z w i s k o , a d r e s +)>
<! ATTLIST g w i a z d a g w i a z d a I d ID
wy step ujeW IDREFS>
<!ELEMENT n a z w i s k o (\#PCDATA)>
<!ELEMENT a d r e s ( u l i c a , m i a s t o )>
<!ELEMENT u l i c a (\#PCDATA)>
<!ELEMENT m i a s t o (\#PCDATA)>
<!ELEMENT f i l m ( t y t u l , r o k , d l u g o s c )>
<! ATTLIST f i l m f i l m I d ID
gwiazdyW IDREFS>
<!ELEMENT t y t u l (\#PCDATA)>
<!ELEMENT r o k (\#PCDATA)>
<!ELEMENT d l u g o s c (\#PCDATA)>
]>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 18 / 61
Atrybuty – przykład
<? xml v e r s i o n=" 1 . 0 " e n c o d i n g=" u t f −8" s t a n d a l o n e=" no " ?>
<!DOCTYPE Gwiazdy−F i l m y SYSTEM " g w i a z d y −f i l m y . d t d ">
<g w i a z d y −f i l m y>
<g w i a z d a g w i a z d a I d=" c f " wyst epuj eW="gw , ␣ i k , ␣ p j ">
<n a z w i s k o> C a r r i e F i s c h e r</ n a z w i s k o>
<a d r e s>
< u l i c a>123 Maple S t .</ u l i c a>
<m i a s t o>H o l l y w o o d</ m i a s t o>
</ a d r e s>
</ g w i a z d a>
<g w i a z d a g w i a z d a I d="mh" w yste puje W=" i k , ␣ p j ">
<n a z w i s k o>Mark H a m i l l</ nazwa>
<a d r e s>
< u l i c a>456 Oak Rd .</ u l i c a>
<m i a s t o>M a l i b u</ m i a s t o>
</ a d r e s>
<a d r e s>
< u l i c a>123 P i n e Av .</ u l i c a>
<m i a s t o>Brentwood</ m i a s t o>
</ a d r e s>
</ g w i a z d a>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 19 / 61
Atrybuty – przykład
< f i l m f i l m I d="gw" gwiazdyW=" c f ">
< t y t u l>G w i e z d n e Wojny</ t y t u l>
<r o k>1977</ r o k>
<d l u g o s c>93</ d l u g o s c>
</ f i l m>
< f i l m f i l m I d=" i k " gwiazdyW=" c f , ␣mh">
< t y t u l>G w i e z d n e Wojny</ t y t u l>
<r o k>1980</ r o k>
<d l u g o s c>96</ d l u g o s c>
</ f i l m>
< f i l m f i l m I d=" p j " gwiazdyW=" c f , ␣mh">
< t y t u l>Powrot J e d i</ t y t u l>
<r o k>1983</ r o k>
<d l u g o s c>94</ d l u g o s c>
</ f i l m>
</ g w i a z d y −f i l m y>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 20 / 61
Document Object Model – DOM
Konwencja opisu dokumentu XML (HTML, XHTML) pozwalająca na dostęp do poszczególnych elementów oraz wprowadzanie zmian w dokumencie.
Implementacje w przeglądarkach webowych (JavaScript) oraz bibliotekach obsługujących pliki XML.
W Pythonie moduł xml.dom.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 21 / 61
xml.dom – podstawowe API
Klasy
Document Cały dokument
Node Klasa, z której dziedziczą składniki dokumentu Element Elementy XML
Attr Atrybuty elementów Comment Komentarze
Text Napisy (tekstowa zawartość elementów)
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 22 / 61
xml.dom.minidom – minimalistyczna implementacja DOM
Funkcje
xml.dom.minidom.parse(filename_or_file) Wczytuje dokument z pliku lub obiektu plikowego
xml.dom.minidom.parseString(string) Wczytuje dokument z napisu
Przykład
>>> d=xml . dom . minidom . p a r s e S t r i n g ( "<node>Text </node>" )
>>> d
<xml . dom . minidom . Document i n s t a n c e a t 0 x105bed638>
>>> d . d o c u m e n t E l e m e n t
<DOM E l e m e n t : node a t 0 x105bed680>
>>> d . d o c u m e n t E l e m e n t . tagName u ’ node ’
>>> d . d o c u m e n t E l e m e n t . c h i l d N o d e s [<DOM T e x t node " u ’ T e x t ’ " >]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 23 / 61
Modyfikacje DOM
>>> n e w e l=d . c r e a t e E l e m e n t ( ’ e x t r a n o d e ’ )
>>> n o d e t e x t=d . d o c u m e n t E l e m e n t . c h i l d N o d e s [ 0 ]
>>> d . d o c u m e n t E l e m e n t . i n s e r t B e f o r e ( n e w e l , n o d e t e x t )
<DOM E l e m e n t : e x t r a n o d e a t 0 x 1 0 5 b e d 3 f 8 >
>>> n e w e l=d . c r e a t e E l e m e n t ( ’ e x t r a n o d e ’ )
>>> d . d o c u m e n t E l e m e n t . a p p e n d C h i l d ( n e w e l )
<DOM E l e m e n t : e x t r a n o d e a t 0 x 1 0 5 a c 7 3 2 0 >
>>> d . d o c u m e n t E l e m e n t . c h i l d N o d e s
[<DOM E l e m e n t : e x t r a n o d e a t 0 x 1 0 5 b e d 3 f 8 >, <DOM T e x t node "u ’ Text ’" > , <DOM E l e m e n t : e x t r a n o d e a t 0 x 1 0 5 a c 7 3 2 0 >]
>>> d . d o c u m e n t E l e m e n t . c h i l d N o d e s [ 0 ] . a p p e n d C h i l d ( d . c r e a t e T e x t N o d e ( ’ E x t r a 1 ’ ) )
<DOM T e x t node " ’ E x t r a 1 ’" >
>>> d . d o c u m e n t E l e m e n t . c h i l d N o d e s [ 2 ] . a p p e n d C h i l d ( d . c r e a t e T e x t N o d e ( ’ E x t r a 2 ’ ) )
<DOM T e x t node " ’ E x t r a 2 ’" >
>>> d . d o c u m e n t E l e m e n t . t o x m l ( )
u ’< node><e x t r a n o d e >E x t r a 1 </ e x t r a n o d e >Text<e x t r a n o d e >E x t r a 2 </ e x t r a n o d e ></node >’
>>> d . d o c u m e n t E l e m e n t . r e m o v e C h i l d ( n o d e t e x t )
<DOM T e x t node "u ’ Text ’" >
>>> d . d o c u m e n t E l e m e n t . t o x m l ( )
u ’< node><e x t r a n o d e >E x t r a 1 </ e x t r a n o d e ><e x t r a n o d e >E x t r a 2 </ e x t r a n o d e ></node >’
>>>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 24 / 61
Wyszukiwanie
tree.xml
<!DOCTYPE t r e e [ <!ATTLIST node i d ID #IMPLIED>]>
< t r e e>
<node t y p e=" domain " i d=" B a c t e r i a "></ node>
<node t y p e=" domain " i d=" A r c h a e a "></ node>
<node t y p e=" domain " i d=" E u k a r y o t a ">
<node t y p e=" s u p e r g r o u p " i d=" A r c h a e p l a s t i d a "></ node>
<node t y p e=" s u p e r g r o u p " i d=" O p i s t h o k o n t a ">
<node t y p e=" kingdom " i d=" F u n g i ">
<node t y p e=" g e n u s " i d=" Muchomorek "></ node>
</ node>
<node t y p e=" kingdom " i d=" A n i m a l i a ">
<node t y p e=" t y p e " i d=" C h o r d a t a ">
<node t y p e=" c l a s s " i d=" A m p h i b i a ">
<node t y p e=" g e n u s " i d=" Z i e l o n a ␣ z a b k a "></ node>
</ node>
<node t y p e=" c l a s s " i d=" S a u r o p s i d a "></ node>
<node t y p e=" c l a s s " i d=" A v e s "></ node>
<node t y p e=" c l a s s " i d=" S y n a p s i d a "></ node>
<node t y p e=" c l a s s " i d=" Mammalia ">
<node t y p e=" g e n u s " i d=" Myszka ␣ mala "></ node>
</ node>
</ node>
<node t y p e=" t y p e " i d=" A r t h r o p o d a "></ node>
</ node>
</ node>
</ node>
</ t r e e>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 25 / 61
Wyszukiwanie c.d.
>>> d=xml . dom . minidom . p a r s e ( ’ t r e e . xml ’ )
>>> myszka=d . g e t E l e m e n t B y I d ( ’ Myszka mala ’ )
>>> myszka
<DOM E l e m e n t : node a t 0 x 1 0 5 b e 4 a 2 8 >
>>> x=myszka
>>> w h i l e x . tagName==’node ’ : . . . r e s . a p p e n d ( x )
. . . x=x . p a r e n t N o d e . . .
>>> r e s
[<DOM E l e m e n t : node a t 0 x 1 0 5 b e 4 a 2 8 >, <DOM E l e m e n t : node a t 0 x 1 0 5 b e d 1 2 8 >,
<DOM E l e m e n t : node a t 0 x 1 0 5 b f 1 2 4 8 >, <DOM E l e m e n t : node a t 0 x 1 0 5 b f 0 f 8 0 >,
<DOM E l e m e n t : node a t 0 x 1 0 5 b f 0 7 a 0 >, <DOM E l e m e n t : node a t 0 x 1 0 5 b f 0 2 9 0 >]
>>> [ ( x . g e t A t t r i b u t e ( ’ t y p e ’ ) , x . g e t A t t r i b u t e ( ’ i d ’ ) ) f o r x i n r e s ]
[ ( u ’ g e n u s ’ , u ’ Myszka mala ’ ) , ( u ’ c l a s s ’ , u ’ Mammalia ’ ) , ( u ’ t y p e ’ , u ’ C h o r d a t a ’ ) , ( u ’ kingdom ’ , u ’ A n i m a l i a ’ ) , ( u ’ s u p e r g r o u p ’ , u ’ O p i s t h o k o n t a ’ ) ,
( u ’ domain ’ , u ’ E u k a r y o t a ’ ) ]
>>>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 26 / 61
gnosis.xml
http://www.gnosis.cx/download/Gnosis_Utils.More/Gnosis_
Utils-1.2.2.tar.gz
Moduł służący do konwersji XML na hierarchie zwykłych obiektów.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 27 / 61
gnosis.xml c.d.
Przykład
>>> d= o b j e c t i f y . m a k e _ i n s t a n c e ( " t r e e 1 . xml " )
>>> d
< t r e e i d ="107256890" >
>>> d . __dict__
{ ’ _seq ’ : [ u ’ \ t e x t b a c k s l a s h {} n ’ , <node i d ="1072568 d0 ">, u ’ \ t e x t b a c k s l a s h {} n
’ , <node i d ="107256850" > ,
u ’ \ t e x t b a c k s l a s h {} n ’ , <node i d ="107256950" > , u ’ \ t e x t b a c k s l a s h {} n ’ ] , ’ node ’ : [< node i d ="1072568 d0 ">,
<node i d ="107256850" > , <node i d ="107256950" >] , ’PCDATA ’ : ’ ’ , ’ __parent__ ’ : None }
>>> d . node
[< node i d ="1072568 d0 ">, <node i d ="107256850" > , <node i d ="107256950" >]
>>> d . node [ 0 ] . __dict__
{u ’ t y p e ’ : u ’ domain ’ , u ’ i d ’ : u ’ B a c t e r i a ’ , ’ __parent__ ’ : < t r e e i d ="107256890" >}
>>> [ x . i d f o r x i n d . node ]
[ u ’ B a c t e r i a ’ , u ’ A r c h a e a ’ , u ’ E u k a r y o t a ’ ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 28 / 61
gnosis.xml c.d.
Wypisywanie
>>> o b j e c t i f y . u t i l s . w r i t e _ x m l ( d )
<t r e e >
<node t y p e=domain i d=B a c t e r i a ></node>
<node t y p e=domain i d=A r c h a e a ></node>
<node t y p e=domain i d=E u k a r y o t a >
<node t y p e=s u p e r g r o u p i d=A r c h a e p l a s t i d a ></node>
<node t y p e=s u p e r g r o u p i d=O p i s t h o k o n t a >
<node t y p e=kingdom i d=F u n g i >
<node t y p e=g e n u s i d=Muchomorek></node>
</node>
<node t y p e=kingdom i d=A n i m a l i a >
. . .
</node>
</node>
</node>
</ t r e e >>>>
>>> d . l a b e l ="T r e e o f l i f e "
>>> o b j e c t i f y . u t i l s . w r i t e _ x m l ( d )
< t r e e l a b e l =T r e e o f l i f e >
<node t y p e=domain i d=B a c t e r i a ></node>
. . .
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 29 / 61
gnosis.xml c.d.
Obchodzenie drzewa
>>> o b j e c t i f y . u t i l s . walk_xo ( d )
< g e n e r a t o r o b j e c t walk_xo a t 0 x 10 73 15 b 90>
>>> l i s t ( o b j e c t i f y . u t i l s . walk_xo ( d ) )
[< t r e e i d ="107256890" > , <node i d ="1072568 d0 ">, <node i d ="107256850" > ,
<node i d ="107256950" > , <node i d ="1072569 d0 ">, <node i d ="107256 b10 ">,
<node i d ="107256 b50 ">, <node i d ="107256 b90 ">, <node i d ="107256 bd0 ">,
<node i d ="107256 c 1 0 ">, <node i d ="107256 c 5 0 ">, <node i d ="107256 c 9 0 ">,
<node i d ="107256 cd 0 ">, <node i d ="107256 d10 ">, <node i d ="107256 d50 ">,
<node i d ="107256 d90 ">, <node i d ="107256 dd0 ">, <node i d ="107256 e 1 0 " >]
>>>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 30 / 61
Czym są elementy dokumentu w gnosis.xml?
>>> d . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_tree ’>
>>> d . node [ 0 ] . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_node’>
Obiekty mogą mieć metody.
>>> d e f n o d e _ r e p r ( s e l f ) :
. . . r e t u r n " ’"+ s e l f . t y p e +": "+ s e l f . i d +" ’" . . .
>>> g n o s i s . xml . o b j e c t i f y . _XO_node . __repr__=n o d e _ r e p r
W00t
>>> l i s t ( o b j e c t i f y . u t i l s . walk_xo ( d ) )
[< t r e e i d ="107256890" > , ’ domain : B a c t e r i a ’ , ’ domain : A r c h a e a ’ ,
’ domain : E u k a r y o t a ’ , ’ s u p e r g r o u p : A r c h a e p l a s t i d a ’ , ’ s u p e r g r o u p : O p i s t h o k o n t a ’ ,
’ kingdom : F u n g i ’ , ’ g e n u s : Muchomorek ’ , ’ kingdom : A n i m a l i a ’ , ’ t y p e : C h o r d a t a ’ ,
’ c l a s s : Amphibia ’ , ’ g e n u s : Z i e l o n a z a b k a ’ , ’ c l a s s : S a u r o p s i d a ’ , ’ c l a s s : Aves ’ ,
’ c l a s s : S y n a p s i d a ’ , ’ c l a s s : Mammalia ’ , ’ g e n u s : Myszka mala ’ , ’ t y p e : A r t h r o p o d a ’ ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 31 / 61
Czym są elementy dokumentu w gnosis.xml?
>>> d . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_tree ’>
>>> d . node [ 0 ] . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_node’>
Obiekty mogą mieć metody.
>>> d e f n o d e _ r e p r ( s e l f ) :
. . . r e t u r n " ’"+ s e l f . t y p e +": "+ s e l f . i d +" ’" . . .
>>> g n o s i s . xml . o b j e c t i f y . _XO_node . __repr__=n o d e _ r e p r
W00t
>>> l i s t ( o b j e c t i f y . u t i l s . walk_xo ( d ) )
[< t r e e i d ="107256890" > , ’ domain : B a c t e r i a ’ , ’ domain : A r c h a e a ’ ,
’ domain : E u k a r y o t a ’ , ’ s u p e r g r o u p : A r c h a e p l a s t i d a ’ , ’ s u p e r g r o u p : O p i s t h o k o n t a ’ ,
’ kingdom : F u n g i ’ , ’ g e n u s : Muchomorek ’ , ’ kingdom : A n i m a l i a ’ , ’ t y p e : C h o r d a t a ’ ,
’ c l a s s : Amphibia ’ , ’ g e n u s : Z i e l o n a z a b k a ’ , ’ c l a s s : S a u r o p s i d a ’ , ’ c l a s s : Aves ’ ,
’ c l a s s : S y n a p s i d a ’ , ’ c l a s s : Mammalia ’ , ’ g e n u s : Myszka mala ’ , ’ t y p e : A r t h r o p o d a ’ ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 31 / 61
Czym są elementy dokumentu w gnosis.xml?
>>> d . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_tree ’>
>>> d . node [ 0 ] . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_node’>
Obiekty mogą mieć metody.
>>> d e f n o d e _ r e p r ( s e l f ) :
. . . r e t u r n " ’"+ s e l f . t y p e +": "+ s e l f . i d +" ’"
. . .
>>> g n o s i s . xml . o b j e c t i f y . _XO_node . __repr__=n o d e _ r e p r
W00t
>>> l i s t ( o b j e c t i f y . u t i l s . walk_xo ( d ) )
[< t r e e i d ="107256890" > , ’ domain : B a c t e r i a ’ , ’ domain : A r c h a e a ’ ,
’ domain : E u k a r y o t a ’ , ’ s u p e r g r o u p : A r c h a e p l a s t i d a ’ , ’ s u p e r g r o u p : O p i s t h o k o n t a ’ ,
’ kingdom : F u n g i ’ , ’ g e n u s : Muchomorek ’ , ’ kingdom : A n i m a l i a ’ , ’ t y p e : C h o r d a t a ’ ,
’ c l a s s : Amphibia ’ , ’ g e n u s : Z i e l o n a z a b k a ’ , ’ c l a s s : S a u r o p s i d a ’ , ’ c l a s s : Aves ’ ,
’ c l a s s : S y n a p s i d a ’ , ’ c l a s s : Mammalia ’ , ’ g e n u s : Myszka mala ’ , ’ t y p e : A r t h r o p o d a ’ ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 31 / 61
Czym są elementy dokumentu w gnosis.xml?
>>> d . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_tree ’>
>>> d . node [ 0 ] . __class__
< c l a s s ’ g n o s i s . xml . o b j e c t i f y . _ o b j e c t i f y . _XO_node’>
Obiekty mogą mieć metody.
>>> d e f n o d e _ r e p r ( s e l f ) :
. . . r e t u r n " ’"+ s e l f . t y p e +": "+ s e l f . i d +" ’"
. . .
>>> g n o s i s . xml . o b j e c t i f y . _XO_node . __repr__=n o d e _ r e p r
W00t
>>> l i s t ( o b j e c t i f y . u t i l s . walk_xo ( d ) )
[< t r e e i d ="107256890" > , ’ domain : B a c t e r i a ’ , ’ domain : A r c h a e a ’ ,
’ domain : E u k a r y o t a ’ , ’ s u p e r g r o u p : A r c h a e p l a s t i d a ’ , ’ s u p e r g r o u p : O p i s t h o k o n t a ’ ,
’ kingdom : F u n g i ’ , ’ g e n u s : Muchomorek ’ , ’ kingdom : A n i m a l i a ’ , ’ t y p e : C h o r d a t a ’ ,
’ c l a s s : Amphibia ’ , ’ g e n u s : Z i e l o n a z a b k a ’ , ’ c l a s s : S a u r o p s i d a ’ , ’ c l a s s : Aves ’ ,
’ c l a s s :P. Daniluk(Wydział Fizyki)S y n a p s i d a ’ , ’ c l a s s : Mammalia ’ ,PO w. XII ’ g e n u s : Myszka mala ’ ,Jesień 2016’ t y p e :31 / 61A r t h r o p o d a ’ ]
Czym są elementy dokumentu w gnosis.xml?
Można a priori zdefiniować klasy odpowiadające elementom.
c l a s s Node ( g n o s i s . xml . o b j e c t i f y ._XO_) : d e f r e p r( s e l f ) :
r e t u r n " ’ "+ s e l f . t y p e+" : ␣ "+ s e l f . i d+" ’ "
g n o s i s . xml . o b j e c t i f y . _XO_node=Node
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 32 / 61
Relacje
Relacja to podzbiór iloczynu kartezjańskiego Dwuargumentowa R ⊂ A × B
n-argumentowa R ⊂ A
1× A
2× . . . A
nReprezentacja jako dwuwymiarowa tabela
Relacja Filmy
tytuł rok długość typFilmu
Gwiezdne Wojny 1977 124 kolor Potężne Kaczory 1991 104 kolor Świat Wayne’a 1992 95 kolor
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 33 / 61
Relacje
Relacja to podzbiór iloczynu kartezjańskiego Dwuargumentowa R ⊂ A × B
n-argumentowa R ⊂ A
1× A
2× . . . A
nReprezentacja jako dwuwymiarowa tabela
Relacja Filmy
tytuł rok długość typFilmu
Gwiezdne Wojny 1977 124 kolor Potężne Kaczory 1991 104 kolor Świat Wayne’a 1992 95 kolor
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 33 / 61
Relacje c.d.
Atrybuty
tytuł, rok, długość, typFilmu
Schemat
Filmy(tytuł, rok, długość, typFilmu)
Dziedziny tytuł – tekst
rok, długość – liczby całkowite typFilmu – {kolor, czarno-biały}
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 34 / 61
Schemat
Nazwy zbiorów w iloczynie kartezjańskim to atrybuty
Nazwa relacji i zbiór uporządkowany jej atrybutów tworzą schemat relacji
Projekt relacyjnej bazy danych zawiera zazwyczaj kilka relacji Zbiór schematów relacji projektu nazywamy schematem bazy danych Wiersze tabeli (poza nagłówkowym) – elementy relacji – nazywane są krotkami
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 35 / 61
Dziedziny (typy danych)
Każda składowa relacji ma swój typ danych
Dostępne typy danych zależą od implementacji DBMS Najczęściej używane to
I liczba całkowita
I liczba rzeczywista
I znak
I łańcuch znaków
I data
I boolean
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 36 / 61
Schemat związków encji
Filmy
tytuł rok
długość
typTaśmy
Gra-w Gwiazdy
nazwisko adres
Posiada Studia
nazwa adres
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 37 / 61
Schemat relacyjny
Zbiory encji → relacje
Filmy(tytuł, rok, długość, typFilmu) Gwiazdy(nazwisko, adres)
Studia(nazwa, adres)
Związki → relacje
Posiada(tytuł, rok, nazwaStudia) Gra-w(tytuł, rok, nazwiskoGwiazdy)
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 38 / 61
Relacje odpowiadające związkom
Posiada – wiele do jeden
tytuł rok nazwaStudia
Gwiezdne Wojny 1977 Fox Potężne Kaczory 1991 Disney Świat Wayne’a 1992 Paramount
Gra-w – wiele do wiele
tytuł rok nazwiskoGwiazdy
Gwiezdne Wojny 1977 Carrie Fisher Gwiezdne Wojny 1977 Mark Hamill Gwiezdne Wojny 1977 Harrison Ford Potężne Kaczory 1991 Emilio Estevez Świat Wayne’a 1992 Dana Carvey Świat Wayne’a 1992 Mike Meyers
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 39 / 61
Relacje odpowiadające związkom c.d.
Gwiazdy Kontrakty Filmy
Studia
Studio producenta Studio gwiazdy
Kontrakty(nazwiskoGwiazdy, tytuł, rok, studioGwiazdy, studioProducenta)
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 40 / 61
Podejście obiektowe
Problem
Korzystanie z SQL może być kłopotliwe. Formułowanie zapytań i konwersje odpowiedzi do strawnego formatu jest bardzo żmudne.
Pomysł
Zdefiniujmy mapowanie encji z bazy danych na obiekty w Pythonie.
SQLAlchemy
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.
It provides a full suite of well known enterprise-level persistence patterns, designed for efficient and high-performing database access, adapted into a simple and Pythonic domain language.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 41 / 61
Podejście obiektowe
Problem
Korzystanie z SQL może być kłopotliwe. Formułowanie zapytań i konwersje odpowiedzi do strawnego formatu jest bardzo żmudne.
Pomysł
Zdefiniujmy mapowanie encji z bazy danych na obiekty w Pythonie.
SQLAlchemy
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives application developers the full power and flexibility of SQL.
It provides a full suite of well known enterprise-level persistence patterns, designed for efficient and high-performing database access, adapted into a simple and Pythonic domain language.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 41 / 61
SQLAlchemy
1
relacje ←→ klasy
2
encje(krotki) ←→ obiekty
3
atrybuty relacji ←→ atrybuty obiektów
4
związki ←→ atrybuty obiektów
5
definicja relacji (CREATE TABLE) ←→ atrybuty klasowe
6
zapytania SQL ←→ metoda query
7
wstawianie krotek (INSERT) ←→ tworzenie obiektów i dodawanie do sesji
Klasy odpowiadające relacjom mogą mieć dowolne metody.
Baza danych działa trochę jak repozytorium obiektów.
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 42 / 61
Przykłady
Tutorial
http://docs.sqlalchemy.org/en/rel_0_8/orm/tutorial.html
Start
>>> i m p o r t s q l a l c h e m y
>>> s q l a l c h e m y . __version__
0 . 8 . 0
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 43 / 61
Połączenie z bazą danych
>>> e n g i n e=s q l a l c h e m y . c r e a t e _ e n g i n e ( ’ s q l i t e : / / / : memory : ’ , e c h o=True )
>>> e n g i n e . e x e c u t e ( " SELECT 1 " ) . s c a l a r ( )
2013−12−18 2 3 : 4 3 : 4 7 , 6 7 2 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e SELECT 1 2013−12−18 2 3 : 4 3 : 4 7 , 6 7 2 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e ( ) 1
>>>
W przykładach używamy SQLite.
MySQL
m y s q l : / / l o g i n : h a s l o @ s e r w e r / b a z a
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 44 / 61
Mapowanie
from s q l a l c h e m y . e x t . d e c l a r a t i v e i m p o r t d e c l a r a t i v e _ b a s e Base = d e c l a r a t i v e _ b a s e ( )
from s q l a l c h e m y i m p o r t Column , I n t e g e r , S t r i n g c l a s s U s e r ( Base ) :
__tablename__ = ’ u s e r s ’
i d = Column ( I n t e g e r , p r i m a r y _ k e y=True ) name = Column ( S t r i n g )
f u l l n a m e = Column ( S t r i n g ) p a s s w o r d = Column ( S t r i n g )
d e f __init__ ( s e l f , name , f u l l n a m e , p a s s w o r d ) : s e l f . name = name
s e l f . f u l l n a m e = f u l l n a m e s e l f . p a s s w o r d = p a s s w o r d d e f __repr__ ( s e l f ) :
r e t u r n "<U s e r ( ’\% s ’ , ’ \ % s ’ , ␣ ’\% s ’) > " \% ( s e l f . name , s e l f . f u l l n a m e , s e l f . p a s s w o r d )
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 45 / 61
Tworzenie tabel
>>> Base . m e t a d a t a . c r e a t e _ a l l ( e n g i n e )
2013−12−19 0 0 : 0 2 : 3 9 , 7 2 9 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e PRAGMA t a b l e _ i n f o ( " u s e r s " ) 2013−12−19 0 0 : 0 2 : 3 9 , 7 3 0 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e ( )
2013−12−19 0 0 : 0 2 : 3 9 , 7 3 0 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e CREATE TABLE u s e r s (
i d INTEGER NOT NULL , name VARCHAR,
f u l l n a m e VARCHAR, p a s s w o r d VARCHAR, PRIMARY KEY ( i d ) )
2013−12−19 0 0 : 0 2 : 3 9 , 7 3 0 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e ( ) 2013−12−19 0 0 : 0 2 : 3 9 , 7 3 0 INFO s q l a l c h e m y . e n g i n e . b a s e . E n g i n e COMMIT
>>>
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 46 / 61
Tworzenie krotek/obiektów
>>> e d _ u s e r = U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ e d s p a s s w o r d ’ )
>>> e d _ u s e r . name
’ ed ’
>>> e d _ u s e r . p a s s w o r d
’ e d s p a s s w o r d ’
>>> s t r ( e d _ u s e r . i d )
’ None ’
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 47 / 61
Sesje
Operacje na bazie danych odbywają się za pośrednictwem sesji.
Sesja przechowuje informacje o obiektach, które były przywołane z bazy oraz stworzone (i dodane do sesji).
Zapytania wydane podczas sesji zwracają dane zgodne ze stanem bazy danych, a nie sesji.
Zamknięcie sesji albo wykonanie zapytania zazwyczaj wiąże się zapisaniem zmian w BD.
Generator sesji
>>> f r o m s q l a l c h e m y . orm i m p o r t s e s s i o n m a k e r
>>> S e s s i o n = s e s s i o n m a k e r ( b i n d=e n g i n e )
Tworzenie sesji
>>> s e s s i o n = S e s s i o n ( )
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 48 / 61
Dodawanie obiektu do bazy
Dodawanie do sesji
>>> e d _ u s e r = U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ e d s p a s s w o r d ’ )
>>> s e s s i o n . add ( e d _ u s e r )
Zapytanie
>>> o u r _ u s e r = s e s s i o n . q u e r y ( U s e r ) . f i l t e r _ b y ( name=’ ed ’ ) . f i r s t ( )
>>> o u r _ u s e r
<U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ e d s p a s s w o r d ’) >
>>> e d _ u s e r i s o u r _ u s e r True
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 49 / 61
Więcej obiektów
Kilka obiektów na raz
>>> s e s s i o n . a d d _ a l l ( [
. . . U s e r ( ’ wendy ’ , ’ Wendy W i l l i a m s ’ , ’ f o o b a r ’ ) , . . . U s e r ( ’ mary ’ , ’ Mary C o n t r a r y ’ , ’ xxg527 ’ ) , . . . U s e r ( ’ f r e d ’ , ’ F r e d F l i n s t o n e ’ , ’ b l a h ’ ) ] )
Zmiana atrybutu
>>> e d _ u s e r . p a s s w o r d = ’ f 8 s 7 c c s ’
Krotki zmienione
>>> s e s s i o n . d i r t y
I d e n t i t y S e t ([ < U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’ ) > ] )
Krotki dodane
>>> s e s s i o n . new
I d e n t i t y S e t ([ < U s e r ( ’ wendy ’ , ’ Wendy W i l l i a m s ’ , ’ f o o b a r ’ ) > ,
<U s e r ( ’ mary ’ , ’ Mary C o n t r a r y ’ , ’ xxg527 ’ ) > ,
<U s e r ( ’ f r e d ’ , ’ F r e d F l i n s t o n e ’ , ’ b l a h ’ ) > ] )
Zatwierdzenie zmian
>>> s e s s i o n . commit ( )
Po zapisaniu id ma wartość
>>> e d _ u s e r . i d 1
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 50 / 61
Sesję można wycofać
Głupie zmiany
>>> e d _ u s e r . name = ’ Edwardo ’
>>> f a k e _ u s e r = U s e r ( ’ f a k e u s e r ’ , ’ I n v a l i d ’ , ’ 1 2 3 4 5 ’ )
>>> s e s s i o n . add ( f a k e _ u s e r )
Są
>>> s e s s i o n . q u e r y ( U s e r ) . f i l t e r ( U s e r . name . in_ ( [ ’ Edwardo ’ , ’ f a k e u s e r ’ ] ) ) . a l l ( ) [< U s e r ( ’ Edwardo ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’ ) > , <U s e r ( ’ f a k e u s e r ’ , ’ I n v a l i d ’ , ’ 1 2 3 4 5 ’ ) > ]
>>> s e s s i o n . r o l l b a c k ( )
Nie ma
>>> e d _ u s e r . name u ’ ed ’
>>> f a k e _ u s e r i n s e s s i o n F a l s e
>>> s e s s i o n . q u e r y ( U s e r ) . f i l t e r ( U s e r . name . in_ ( [ ’ ed ’ , ’ f a k e u s e r ’ ] ) ) . a l l ( ) [< U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’ ) > ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 51 / 61
Proste zapytania
Wyjmowanie obiektów
>>> f o r i n s t a n c e i n s e s s i o n . q u e r y ( U s e r ) . o r d e r _ b y ( U s e r . i d ) : . . . p r i n t i n s t a n c e . name , i n s t a n c e . f u l l n a m e
ed Ed J o n e s
wendy Wendy W i l l i a m s mary Mary C o n t r a r y f r e d F r e d F l i n s t o n e
Wyjmowanie krotek
>>> f o r name , f u l l n a m e i n s e s s i o n . q u e r y ( U s e r . name , \ . . . U s e r . f u l l n a m e ) :
. . . p r i n t name , f u l l n a m e ed Ed J o n e s
wendy Wendy W i l l i a m s mary Mary C o n t r a r y f r e d F r e d F l i n s t o n e
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 52 / 61
Filtrowanie
>>> f o r name , i n s e s s i o n . q u e r y ( U s e r . name ) . \ . . . f i l t e r _ b y ( f u l l n a m e =’Ed J o n e s ’ ) :
. . . p r i n t name ed
>>> f o r name , i n s e s s i o n . q u e r y ( U s e r . name ) . \ . . . f i l t e r ( U s e r . f u l l n a m e ==’Ed J o n e s ’ ) : . . . p r i n t name
ed
Wielokrotne
>>> f o r u s e r i n s e s s i o n . q u e r y ( U s e r ) . f i l t e r ( U s e r . name==’ed ’ ) . . . . f i l t e r ( U s e r . f u l l n a m e ==’Ed J o n e s ’ ) :
. . . p r i n t u s e r
<U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’) >
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 53 / 61
Standardowe operatory
query.filter(User.name == ’ed’) query.filter(User.name != ’ed’) query.filter(User.name.like(’\%ed\%’))
query.filter(User.name.in_([’ed’, ’wendy’, ’jack’]))
query.filter(User.name.in_(session.query(User.name).filter(User.name.like(’\%ed\%’)))) query.filter(~User.name.in_([’ed’, ’wendy’, ’jack’]))
query.filter(User.name == None) query.filter(User.name != None)
query.filter(sqlalchemy.and_(User.name == ’ed’, User.fullname == ’Ed␣Jones’)) query.filter(User.name == ’ed’).filter(User.fullname == ’Ed␣Jones’)
query.filter(sqlalchemy.or_(User.name == ’ed’, User.name == ’wendy’))
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 54 / 61
all(), first(), one()
Wszystkie krotki
>>> q u e r y = s e s s i o n . q u e r y ( U s e r ) . \
. . . f i l t e r ( U s e r . name . l i k e ( ’\% ed ’ ) ) . o r d e r _ b y ( U s e r . i d )
>>> q u e r y . a l l ( )
[< U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’ ) > , <U s e r ( ’ f r e d ’ , ’ F r e d F l i n s t o n e ’ , ’ b l a h ’ ) > ]
Tylko pierwsza
>>> q u e r y . f i r s t ( )
<U s e r ( ’ ed ’ , ’ Ed J o n e s ’ , ’ f 8 s 7 c c s ’) >
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 55 / 61
all(), first(), one() c.d.
Dokładnie jedna
>>> f r o m s q l a l c h e m y . orm . e x c i m p o r t M u l t i p l e R e s u l t s F o u n d
>>> t r y :
. . . u s e r = q u e r y . one ( )
. . . e x c e p t M u l t i p l e R e s u l t s F o u n d , e : . . . p r i n t e
M u l t i p l e r o w s w e r e f o u n d f o r one ( )
>>> f r o m s q l a l c h e m y . orm . e x c i m p o r t N o R e s u l t F o u n d
>>> t r y :
. . . u s e r = q u e r y . f i l t e r ( U s e r . i d == 9 9 ) . one ( ) . . . e x c e p t N o R e s u l t F o u n d , e :
. . . p r i n t e
No row was f o u n d f o r one ( )
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 56 / 61
Związki
from s q l a l c h e m y i m p o r t F o r e i g n K e y
from s q l a l c h e m y . orm i m p o r t r e l a t i o n s h i p , b a c k r e f c l a s s A d d r e s s ( Base ) :
__tablename__ = ’ a d d r e s s e s ’
i d = Column ( I n t e g e r , p r i m a r y _ k e y=True )
e m a i l _ a d d r e s s = Column ( S t r i n g , n u l l a b l e =F a l s e ) u s e r _ i d = Column ( I n t e g e r , F o r e i g n K e y ( ’ u s e r s . i d ’ ) ) u s e r = r e l a t i o n s h i p ( " U s e r " ,
b a c k r e f=b a c k r e f ( ’ a d d r e s s e s ’ , o r d e r _ b y=i d ) ) d e f __init__ ( s e l f , e m a i l _ a d d r e s s ) :
s e l f . e m a i l _ a d d r e s s = e m a i l _ a d d r e s s d e f __repr__ ( s e l f ) :
r e t u r n "<A d d r e s s ( ’\% s ’) > " \% s e l f . e m a i l _ a d d r e s s
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 57 / 61
Związki c.d.
Alternatywnie
c l a s s U s e r ( Base ) :
# . . . .
a d d r e s s e s = r e l a t i o n s h i p ( " A d d r e s s " ,
o r d e r _ b y=" A d d r e s s . i d " , b a c k r e f=" u s e r " )
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 58 / 61
Operacje na związkach
>>> j a c k = U s e r ( ’ j a c k ’ , ’ J a c k Bean ’ , ’ g j f f d d ’ )
>>> j a c k . a d d r e s s e s [ ]
>>> j a c k . a d d r e s s e s = [
. . . A d d r e s s ( e m a i l _ a d d r e s s =’ j a c k @ g o o g l e . com ’ ) , . . . A d d r e s s ( e m a i l _ a d d r e s s =’ j 2 5 @ y a h o o . com ’ ) ]
Związki działają bez SQLa
(obiekty nie są jeszcze dodane do sesji)>>> j a c k . a d d r e s s e s [ 1 ]
<A d d r e s s ( ’ j 2 5 @ y a h o o . com ’) >
>>> j a c k . a d d r e s s e s [ 1 ] . u s e r
<U s e r ( ’ j a c k ’ , ’ J a c k Bean ’ , ’ g j f f d d ’) >
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 59 / 61
Operacje na związkach
Całość dodaje się automatycznie
>>> s e s s i o n . add ( j a c k ) SQL>>> s e s s i o n . commit ( )
Dostęp
>>> j a c k = s e s s i o n . q u e r y ( U s e r ) . f i l t e r _ b y ( name=’ j a c k ’ ) . one ( )
>>> j a c k
<U s e r ( ’ j a c k ’ , ’ J a c k Bean ’ , ’ g j f f d d ’) >
Dopiero teraz załadują się adresy
>>> j a c k . a d d r e s s e s
[< A d d r e s s ( ’ j a c k @ g o o g l e . com ’ ) > , <A d d r e s s ( ’ j 2 5 @ y a h o o . com ’ ) > ]
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 60 / 61
Więcej możliwości
zapytania ze złączeniami podzapytania
związki “wiele do wielu”
transakcje
P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 61 / 61