• Nie Znaleziono Wyników

Programowanie i projektowanie obiektowe Przechowywanie obiektów Paweł Daniluk

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie i projektowanie obiektowe Przechowywanie obiektów Paweł Daniluk"

Copied!
66
0
0

Pełen tekst

(1)

Programowanie i projektowanie obiektowe

Przechowywanie obiektów

Paweł Daniluk

Wydział Fizyki

Jesień 2016

P. Daniluk(Wydział Fizyki) PO w. XII Jesień 2016 1 / 61

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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

(32)

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

(33)

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

(34)

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 ’ ]

(35)

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

(36)

Relacje

Relacja to podzbiór iloczynu kartezjańskiego Dwuargumentowa R ⊂ A × B

n-argumentowa R ⊂ A

1

× A

2

× . . . A

n

Reprezentacja 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

(37)

Relacje

Relacja to podzbiór iloczynu kartezjańskiego Dwuargumentowa R ⊂ A × B

n-argumentowa R ⊂ A

1

× A

2

× . . . A

n

Reprezentacja 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

(38)

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

(39)

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

(40)

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

(41)

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

(42)

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

(43)

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

(44)

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

(45)

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

(46)

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

(47)

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

(48)

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

(49)

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

(50)

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

(51)

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

(52)

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

(53)

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

(54)

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

(55)

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

(56)

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

(57)

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

(58)

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

(59)

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

(60)

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

(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

(62)

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

(63)

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

(64)

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

(65)

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

(66)

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

Cytaty

Powiązane dokumenty

Stosowanie klas abstrakcyjnych jest konieczne, jeżeli ma istnieć możliwość operowania w tym samym kontekście na obiektach różnych klas, które nie mają naturalnej

Metody statyczne powodują kłopoty przy dziedziczeniu, jeżeli atrybuty, do których się odnoszą są przysłonięte w podklasie... Metody statyczne

‘&lt;opis obiektu&gt;’, który jest użyteczny przy debugowaniu – wywoływana przez repr(object). object.__str__(self) zwraca “ładny” napis – wywoływana

Czasami występuje potrzeba opisu klas, które łączą w sobie cechy kilku klas nadrzędnych (np. latająca łódź). Wielodziedziczenie może powodować straszne problemy (Deadly Diamond

Katalogi w strukturze plików serwisu odpowiadają klasom Elementy katalogów (pliki i podkatalogi) odpowiadają atrybutom Aplikacja jest autonomicznym serwerem webowym. Treść nie

Paradygmat obiektowy doskonale nadaje się do opisywania struktury i stanu dużych systemów.. Niestety takie systemy rzadko kiedy pozostają niezmienne

Funkcje i klasy dające możliwie prosty sposób wyrażania operacji na reprezentacjach przetwarzanych informacji..

javax.sql.rowset.serial Provides utility classes to allow serializable mappings be- tween SQL types and data types in the Java programming language.. javax.sql.rowset.spi The