Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perl course, lesson #7

Perl course, lesson #7

Perl and DB interaction

Vadim Pushtaev

April 13, 2015
Tweet

More Decks by Vadim Pushtaev

Other Decks in Programming

Transcript

  1. SQL S E L E C T n a m

    e , s u r n a m e F R O M u s e r s W H E R E a g e > 1 8 ; S E L E C T b a l a n c e F R O M a c c o u n t W H E R E u s e r _ i d = 8 1 8 5 8 S E L E C T * F R O M u s e r s u J O I N a c c o u n t s a O N u . i d = a . u s e r _ i d W H E R E a c c o u n t . b a l a n c e > 0 2 / 42
  2. DBI $ d b h = D B I -

    > c o n n e c t ( $ d s n , $ u s e r , $ p a s s w o r d , { R a i s e E r r o r = > 1 , A u t o C o m m i t = > 0 } ) ; $ d b h - > d o ( $ s q l ) ; 3 / 42
  3. connect $ d b h = D B I -

    > c o n n e c t ( $ d a t a _ s o u r c e , $ u s e r , $ p a s s w o r d , { . . . } ) ; # D B D : : S Q L i t e $ d b h = D B I - > c o n n e c t ( " d b i : S Q L i t e : d b n a m e = d b f i l e " , " " , " " ) ; # D B D : : m y s q l $ d b h = D B I - > c o n n e c t ( " D B I : m y s q l : d a t a b a s e = $ d a t a b a s e ; h o s t = $ h o s t n a m e ; p o r t = $ p o r t " , $ u s e r , $ p a s s w o r d ) ; # D B D : : P g D B I - > c o n n e c t ( " d b i : P g : d b n a m e = $ d b n a m e " , ' ' , ' ' , { A u t o C o m m i t = > 0 } ) ; d b i : D r i v e r N a m e : d a t a b a s e _ n a m e d b i : D r i v e r N a m e : d a t a b a s e _ n a m e @ h o s t n a m e : p o r t d b i : D r i v e r N a m e : d a t a b a s e = d a t a b a s e _ n a m e ; h o s t = h o s t n a m e ; p o r t = p o r t 4 / 42
  4. do m y $ n u m b e r

    _ o f _ r o w s = $ d b h - > d o ( ' D E L E T E F R O M u s e r W H E R E a g e < 1 8 ' ) ; $ d b h - > d o ( " D E L E T E F R O M u s e r W H E R E n a m e = ' $ n a m e ' " ) ; m y $ a g e = < > ; $ d b h - > d o ( " D E L E T E F R O M u s e r W H E R E n a m e = ' $ n a m e ' " ) ; 5 / 42
  5. SQL injections m y $ a g e = q

    { ' O R ( D E L E T E F R O M l o g ) A N D ' ' = ' } ; $ d b h - > d o ( " D E L E T E F R O M u s e r W H E R E n a m e = ' $ n a m e ' " ) ; D E L E T E F R O M u s e r W H E R E n a m e = ' ' O R ( D E L E T E F R O M l o g ) A N D ' ' = ' ' $ n a m e = $ d b h - > q u o t e ( $ n a m e ) ; 6 / 42
  6. prepare, execute m y $ s t h = $

    d b h - > p r e p a r e ( ' D E L E T E F R O M u s e r W H E R E n a m e = ? ' ) ; $ s t h - > e x e c u t e ( ' V a d i m ' ) ; 7 / 42
  7. fetchrow m y $ a r y _ r e

    f = $ s t h - > f e t c h r o w _ a r r a y r e f ; m y @ a r y = $ s t h - > f e t c h r o w _ a r r a y ; m y $ h a s h = $ s t h - > f e t c h r o w _ h a s h r e f ; w h i l e ( @ r o w = $ s t h - > f e t c h r o w _ a r r a y ) { p r i n t " @ r o w \ n " ; } 8 / 42
  8. fetchall_arrayref m y $ a r y = $ s

    t h - > f e t c h a l l _ a r r a y r e f ; # [ [ . . . ] , [ . . . ] , [ . . . ] ] m y $ a r y = $ s t h - > f e t c h a l l _ a r r a y r e f ( { } ) ; # [ { . . . } , { . . . } , { . . . } ] $ t b l _ a r y _ r e f = $ s t h - > f e t c h a l l _ a r r a y r e f ( [ 0 ] ) ; $ t b l _ a r y _ r e f = $ s t h - > f e t c h a l l _ a r r a y r e f ( [ - 2 , - 1 ] ) ; $ t b l _ a r y _ r e f = $ s t h - > f e t c h a l l _ a r r a y r e f ( { f o o = > 1 , B A R = > 1 } ) ; 9 / 42
  9. fetchall_hashref $ s t h - > f e t

    c h a l l _ h a s h r e f ( ' i d ' ) ; # { 1 = > { . . . } , 2 = > { . . . } } $ s t h - > f e t c h a l l _ h a s h r e f ( [ q w ( f o o b a r ) ] ) ; { 1 = > { a = > { . . . } , b = > { . . . } } , 2 = > { a = > { . . . } , b = > { . . . } } , } 10 / 42
  10. selectrow $ d b h - > s e l

    e c t r o w _ a r r a y ( $ s t a t e m e n t , \ % a t t r , @ b i n d _ v a l u e s ) ; $ d b h - > s e l e c t r o w _ a r r a y r e f ( $ s t a t e m e n t , \ % a t t r , @ b i n d _ v a l u e s ) ; $ d b h - > s e l e c t r o w _ h a s h r e f ( $ s t a t e m e n t , \ % a t t r , @ b i n d _ v a l u e s ) ; 12 / 42
  11. selectall $ d b h - > s e l

    e c t a l l _ a r r a y r e f ( $ s t a t e m e n t , \ % a t t r , @ b i n d _ v a l u e s ) ; $ d b h - > s e l e c t a l l _ h a s h r e f ( $ s t a t e m e n t , $ k e y _ f i e l d , \ % a t t r , @ b i n d _ v a l u e s ) ; $ d b h - > s e l e c t c o l _ a r r a y r e f ( $ s t a t e m e n t , \ % a t t r , @ b i n d _ v a l u e s ) ; $ d b h - > s e l e c t c o l _ a r r a y r e f ( " s e l e c t i d , n a m e f r o m t a b l e " , { C o l u m n s = > [ 1 , 2 ] } ) ; $ d b h - > s e l e c t a l l _ a r r a y r e f ( " S E L E C T e n a m e F R O M e m p O R D E R B Y e n a m e " , { S l i c e = > { } } ) ; 13 / 42
  12. Errors $ d b h = D B I -

    > c o n n e c t ( " d b i : D r i v e r N a m e : d b _ n a m e " , $ u s e r , $ p a s s w o r d , { R a i s e E r r o r = > 1 } ) ; $ d b h - > e r r ; $ d b h - > e r r s t r ; 14 / 42
  13. Transactions $ d b h = D B I -

    > c o n n e c t ( " d b i : D r i v e r N a m e : d b _ n a m e " , $ u s e r , $ p a s s w o r d , { A u t o C o m m i t = > 1 } ) ; $ d b h - > b e g i n _ w o r k ; $ d b h - > r o l l b a c k ; $ d b h - > c o m m i t ; 15 / 42
  14. last_insert_id $ d b h - > d o (

    ' I N S E R T I N T O u s e r V A L U E S ( . . . ) ' ) ; m y $ u s e r _ i d = $ d b h - > l a s t _ i n s e r t _ i d ( $ c a t a l o g , $ s c h e m a , $ t a b l e , $ f i e l d , \ % a t t r ) ; 16 / 42
  15. DBIx::Class p a c k a g e L o

    c a l : : S c h e m a : : U s e r ; u s e b a s e q w ( D B I x : : C l a s s : : C o r e ) ; _ _ P A C K A G E _ _ - > t a b l e ( ' u s e r ' ) ; _ _ P A C K A G E _ _ - > a d d _ c o l u m n s ( i d = > { d a t a _ t y p e = > ' i n t e g e r ' , i s _ a u t o _ i n c r e m e n t = > 1 , } , n a m e = > { d a t a _ t y p e = > ' v a r c h a r ' , s i z e = > ' 1 0 0 ' , } , s u p e r u s e r = > { d a t a _ t y p e = > ' b o o l ' , } , ) ; _ _ P A C K A G E _ _ - > s e t _ p r i m a r y _ k e y ( ' i d ' ) ; _ _ P A C K A G E _ _ - > h a s _ m a n y ( v i s i t s = > ' L o c a l : : S c h e m a : : V i s i t ' , ' u s e r _ i d ' ) ; _ _ P A C K A G E _ _ - > m a n y _ t o _ m a n y ( v i s i t e d _ c i t i e s = > ' v i s i t s ' , ' c i t y ' ) ; 17 / 42
  16. Files p a c k a g e L o

    c a l : : S c h e m a ; u s e b a s e q w / D B I x : : C l a s s : : S c h e m a / ; _ _ P A C K A G E _ _ - > l o a d _ n a m e s p a c e s ( ) ; 1 ; L o c a l : : S c h e m a : : R e s u l t : : * ; L o c a l : : S c h e m a : : R e s u l t S e t : : * ; 18 / 42
  17. resultset, result m y $ r e s u l

    t s e t = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) ; m y $ r e s u l t s e t 2 = $ r e s u l t s e t - > s e a r c h ( { a g e = > 2 5 } ) ; w h i l e ( m y $ u s e r = $ r e s u l t s e t - > n e x t ) { p r i n t $ u s e r - > n a m e . " \ n " ; } p r i n t j o i n " \ n " , $ r e s u l t s e t 2 - > a l l ( ) ; 19 / 42
  18. search $ r s = $ r s - >

    s e a r c h ( { a g e = > { ' > = ' = > 1 8 } , p a r e n t _ i d = > u n d e f , } ) ; @ r e s u l t s = $ r s - > a l l ( ) ; @ r e s u l t s = $ r s - > s e a r c h ( . . . ) ; $ r s = $ r s - > s e a r c h ( . . . ) ; $ r s = $ r s - > s e a r c h _ r s ( . . . ) ; 20 / 42
  19. search — attributes $ r s = $ r s

    - > s e a r c h ( { p a g e = > { ' > = ' = > 1 8 } } , { o r d e r _ b y = > { - d e s c = > [ q w ( a b c ) ] } } , ) ; $ r s = $ r s - > s e a r c h ( u n d e f , { r o w s = > 1 0 0 } ) ; 21 / 42
  20. search — duplicate key # : - ( $ r

    s = $ r s - > s e a r c h ( { a g e = > { ' > = ' = > 1 8 } , a g e = > { ' < ' = > 6 0 } , } ) ; # : - ) $ r s = $ r s - > s e a r c h ( [ { a g e = > { ' > = ' = > 1 8 } } , { a g e = > { ' < ' = > 6 0 } } , ] ) ; 22 / 42
  21. find, single $ u s e r = $ s

    c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( { i d = > 8 1 8 5 8 } ) ; $ u s e r = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( 8 1 8 5 8 ) ; $ u s e r = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h ( { i d = > 8 1 8 5 8 } ) - > s i n g l e ; 23 / 42
  22. count m y $ c o u n t =

    $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h ( { n a m e = > ' n a m e ' , a g e = > 1 8 , } ) - > c o u n t ( ) ; 24 / 42
  23. select — advanced $ r e s u l t

    s e t - > s e a r c h ( { d a t e = > { ' > ' = > \ ' N O W ( ) ' } , } ) ; $ r s - > s e a r c h ( \ [ ' Y E A R ( d a t e _ o f _ b i r t h ) = ? ' , 1 9 7 9 ] ) ; m y @ a l b u m s = $ s c h e m a - > r e s u l t s e t ( ' A l b u m ' ) - > s e a r c h ( { - o r = > [ - a n d = > [ a r t i s t = > { ' l i k e ' , ' % S m a s h i n g P u m p k i n s % ' } , t i t l e = > ' S i a m e s e D r e a m ' , ] , a r t i s t = > ' S t a r c h i l d r e n ' , ] , } ) ; 25 / 42
  24. Relations p a c k a g e L o

    c a l : : S c h e m a : : U s e r ; u s e b a s e q w ( D B I x : : C l a s s : : C o r e ) ; _ _ P A C K A G E _ _ - > t a b l e ( ' u s e r ' ) ; _ _ P A C K A G E _ _ - > a d d _ c o l u m n s ( . . . ) ; _ _ P A C K A G E _ _ - > s e t _ p r i m a r y _ k e y ( ' i d ' ) ; _ _ P A C K A G E _ _ - > h a s _ m a n y ( d o g s = > ' L o c a l : : S c h e m a : : D o g ' , ' u s e r _ i d ' ) ; p a c k a g e L o c a l : : S c h e m a : : D o g ; u s e b a s e q w ( D B I x : : C l a s s : : C o r e ) ; _ _ P A C K A G E _ _ - > t a b l e ( ' d o g ' ) ; _ _ P A C K A G E _ _ - > a d d _ c o l u m n s ( . . . ) ; _ _ P A C K A G E _ _ - > s e t _ p r i m a r y _ k e y ( ' i d ' ) ; _ _ P A C K A G E _ _ - > b e l o n g s _ t o ( u s e r = > ' L o c a l : : S c h e m a : : U s e r ' , ' u s e r _ i d ' ) ; 26 / 42
  25. Relations — usage $ u s e r = $

    s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( 8 1 8 5 8 ) ; f o r e a c h m y $ d o g ( $ u s e r - > d o g s ) { p r i n t j o i n ( ' ' , $ d o g - > i d , $ d o g - > u s e r - > i d ) ; } 27 / 42
  26. join $ r s = $ s c h e

    m a - > r e s u l t s e t ( ' D o g ' ) - > s e a r c h ( { ' m e . n a m e ' = > ' S h a r i k ' , ' u s e r . n a m e ' = > ' V a d i m ' , } , { j o i n = > ' u s e r ' , } ) ; 28 / 42
  27. prefetch f o r e a c h m y

    $ u s e r ( $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) ) { f o r e a c h m y $ d o g ( $ u s e r - > d o g s ) { # . . . } } $ r s = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h ( { } , { p r e f e t c h = > ' d o g s ' , # i m p l i e s j o i n } ) ; 29 / 42
  28. Custom methods m y @ w o m e n

    = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > s e a r c h _ w o m e n ( ) - > a l l ( ) ; f o r e a c h m y $ w o m a n ( @ w o m e n ) { $ w o m a n - > l o g ( ' w a s s e l e c t e d ' ) ; } p a c k a g e L o c a l : : S c h e m a : : R e s u l t S e t : : U s e r ; s u b s e a r c h _ w o m e n { m y ( $ s e l f ) = @ _ ; r e t u r n $ s e l f - > s e a r c h ( { g e n d e r = > ' f ' , } ) ; } p a c k a g e L o c a l : : S c h e m a : : R e s u l t : : U s e r ; # . . . s u b l o g { p r i n t { $ l o g } @ _ ; } 30 / 42
  29. new_result, create m y $ u s e r =

    $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > n e w _ r e s u l t ( { n a m e = > ' V a d i m ' , s u p e r u s e r = > 1 , } ) ; $ u s e r - > i n s e r t ( ) ; m y $ a r t i s t = $ a r t i s t _ r s - > c r e a t e ( { a r t i s t i d = > 4 , n a m e = > ' M a n u f a c t u r e d C r a p ' , c d s = > [ { t i t l e = > ' M y F i r s t C D ' , y e a r = > 2 0 0 6 } , { t i t l e = > ' Y e t M o r e T w e e n y - P o p c r a p ' , y e a r = > 2 0 0 7 } , ] , } , ) ; 31 / 42
  30. update, delete $ r e s u l t -

    > l a s t _ m o d i f i e d ( \ ' N O W ( ) ' ) - > u p d a t e ( ) ; # O R $ r e s u l t - > u p d a t e ( { l a s t _ m o d i f i e d = > \ ' N O W ( ) ' } ) ; $ u s e r - > d e l e t e ( ) ; 32 / 42
  31. many_to_many p a c k a g e L o

    c a l : : S c h e m a : : U s e r ; # . . . _ _ P A C K A G E _ _ - > h a s _ m a n y ( v i s i t s = > ' L o c a l : : S c h e m a : : V i s i t ' , ' u s e r _ i d ' ) ; _ _ P A C K A G E _ _ - > m a n y _ t o _ m a n y ( v i s i t e d _ c i t i e s = > ' v i s i t s ' , ' c i t y ' ) ; p a c k a g e L o c a l : : S c h e m a : : C i t y ; # . . . _ _ P A C K A G E _ _ - > h a s _ m a n y ( v i s i t s = > ' L o c a l : : S c h e m a : : V i s i t ' , ' c i t y _ i d ' ) ; _ _ P A C K A G E _ _ - > m a n y _ t o _ m a n y ( v i s i t e d _ b y = > ' v i s i t s ' , ' u s e r ' ) ; p a c k a g e L o c a l : : S c h e m a : : V i s i t ; # . . . _ _ P A C K A G E _ _ - > b e l o n g s _ t o ( u s e r = > ' L o c a l : : S c h e m a : : U s e r ' , ' u s e r _ i d ' ) ; _ _ P A C K A G E _ _ - > b e l o n g s _ t o ( c i t y = > ' L o c a l : : S c h e m a : : C i t y ' , ' c i t y _ i d ' ) ; m y @ c i t i e s = $ s c h e m a - > r e s u l t s e t ( ' U s e r ' ) - > f i n d ( 8 1 8 5 8 ) - > v i s i t e d _ c i t i e s ; 33 / 42
  32. storage $ s c h e m a - >

    s t o r a g e - > d e b u g ( 1 ) ; $ s c h e m a - > s t o r a g e - > d b h ( ) ; 34 / 42
  33. DBIx::Class::Schema::Loader u s e D B I x : :

    C l a s s : : S c h e m a : : L o a d e r q w / m a k e _ s c h e m a _ a t / ; m a k e _ s c h e m a _ a t ( ' M y : : S c h e m a ' , { d e b u g = > 1 , d u m p _ d i r e c t o r y = > ' . / l i b ' , } , [ ' d b i : P g : d b n a m e = " f o o " ' , ' m y u s e r ' , ' m y p a s s w o r d ' , { l o a d e r _ c l a s s = > ' M y L o a d e r ' } # o p t i o n a l l y ] , ) ; d b i c d u m p - o d u m p _ d i r e c t o r y = . / l i b \ - o c o m p o n e n t s = ' [ " I n f l a t e C o l u m n : : D a t e T i m e " ] ' \ - o d e b u g = 1 \ M y : : S c h e m a \ ' d b i : P g : d b n a m e = f o o ' \ m y u s e r \ m y p a s s w o r d 35 / 42
  34. SQL::Translator $ s c h e m a - >

    d e p l o y ( ) ; 36 / 42
  35. Memcached u s e C a c h e :

    : M e m c a c h e d : : F a s t ; m y $ m e m d = C a c h e : : M e m c a c h e d : : F a s t - > n e w ( { s e r v e r s = > [ { a d d r e s s = > ' l o c a l h o s t : 1 1 2 1 1 ' , w e i g h t = > 2 . 5 } , ' 1 9 2 . 1 6 8 . 2 5 4 . 2 : 1 1 2 1 1 ' , ' / p a t h / t o / u n i x . s o c k ' ] , n a m e s p a c e = > ' m y : ' , c o n n e c t _ t i m e o u t = > 0 . 2 , # . . . } ) ; 37 / 42
  36. Memached — operations $ m e m d - >

    a d d ( ' s k e y ' , ' t e x t ' ) ; $ m e m d - > s e t ( ' n k e y ' , 5 , 6 0 ) ; $ m e m d - > i n c r ( ' n k e y ' ) ; $ m e m d - > g e t ( ' s k e y ' ) ; 38 / 42
  37. Tarantool m y $ b o x = M R

    : : T a r a n t o o l : : B o x - > n e w ( { s e r v e r s = > " 1 2 7 . 0 . 0 . 1 : 3 3 0 1 3 " , n a m e = > " M y B o x " , # m o s t l y u s e d f o r d e b u g p u r p o s e s s p a c e s = > [ { i n d e x e s = > [ { i n d e x _ n a m e = > ' i d x 1 ' , k e y s = > [ 0 ] , } , { i n d e x _ n a m e = > ' i d x 2 ' , k e y s = > [ 1 , 2 ] , } , ] , s p a c e = > 1 , n a m e = > " p r i m a r y " , d e f a u l t _ i n d e x = > ' i d x 1 ' , f i e l d s = > [ q w / i d f 2 f i e l d 3 f 4 f 5 f 6 f 7 f 8 m i s c _ s t r i n g / ] , } , { # . . . } ] , d e f a u l t _ s p a c e = > " p r i m a r y " , t i m e o u t = > 1 . 0 , r e t r y = > 3 , d e b u g = > 9 , r a i s e = > 0 , } ) ; 39 / 42
  38. Tarantool — usage $ b o o l = $

    b o x - > I n s e r t ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , " a s d f " ) ; @ t u p l e s = $ b o x - > S e l e c t ( 1 , 2 , 3 ) ; $ t u p l e s = $ b o x - > S e l e c t ( [ 1 , 2 , 3 ] , { s p a c e = > " p r i m a r y " , u s e _ i n d e x = > " i d x 1 " } ) ; $ b o o l = $ b o x - > U p d a t e M u l t i ( 1 , [ f 4 = > a d d = > 3 ] ) ; $ b o o l = $ b o x - > D e l e t e ( 1 ) ; 40 / 42
  39. MongoDB u s e M o n g o D

    B ; m y $ c l i e n t = M o n g o D B : : M o n g o C l i e n t - > n e w ( h o s t = > ' l o c a l h o s t ' , p o r t = > 2 7 0 1 7 ) ; m y $ d a t a b a s e = $ c l i e n t - > g e t _ d a t a b a s e ( ' f o o ' ) ; m y $ c o l l e c t i o n = $ d a t a b a s e - > g e t _ c o l l e c t i o n ( ' b a r ' ) ; m y $ i d = $ c o l l e c t i o n - > i n s e r t ( { s o m e = > ' d a t a ' } ) ; m y $ d a t a = $ c o l l e c t i o n - > f i n d _ o n e ( { _ i d = > $ i d } ) ; 41 / 42
  40. ДЗ 7 DBI: while { fetch } запроса с параметрами

    selectall запроса с параметрами DBIx::Class search с join search с prefetch Result­метод ResultSet­метод create, update, delete 42 / 42