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

Flask SQLAlchemy

Flask SQLAlchemy

Python CodeLabs - Intro to Flask SQLAlchemy
http://eueung.github.io/python/flask-sqlalchemy

Eueung Mulyana

November 27, 2015
Tweet

More Decks by Eueung Mulyana

Other Decks in Technology

Transcript

  1.  Basics #1, #2 Relationships #3, #4, #5 Declarative (ORM)

    #6 Manual OR Mapping #7 SQL Abstraction Layer #8 2 / 20
  2. Example #1 f r o m f l a s

    k i m p o r t F l a s k f r o m f l a s k . e x t . s q l a l c h e m y i m p o r t S Q L A l c h e m y # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) a p p . c o n f i g [ ' S Q L A L C H E M Y _ D A T A B A S E _ U R I ' ] = ' s q l i t e : / / / t e s t . d b ' a p p . c o n f i g [ ' S Q L A L C H E M Y _ T R A C K _ M O D I F I C A T I O N S ' ] = T r u e d b = S Q L A l c h e m y ( a p p ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s U s e r ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) u s e r n a m e = d b . C o l u m n ( d b . S t r i n g ( 8 0 ) , u n i q u e = T r u e ) e m a i l = d b . C o l u m n ( d b . S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) d e f _ _ i n i t _ _ ( s e l f , u s e r n a m e , e m a i l ) : s e l f . u s e r n a m e = u s e r n a m e s e l f . e m a i l = e m a i l d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < U s e r % r > ' % s e l f . u s e r n a m e d b . c r e a t e _ a l l ( ) a d m i n = U s e r ( ' a d m i n ' , ' a d m i n @ e x a m p l e . c o m ' ) g u e s t = U s e r ( ' g u e s t ' , ' g u e s t @ e x a m p l e . c o m ' ) d b . s e s s i o n . a d d ( a d m i n ) d b . s e s s i o n . a d d ( g u e s t ) d b . s e s s i o n . c o m m i t ( ) u s e r s = U s e r . q u e r y . a l l ( ) p r i n t u s e r s a d m i n = U s e r . q u e r y . f i l t e r _ b y ( u s e r n a m e = ' a d m i n ' ) . f i r s t ( ) p r i n t a d m i n [ < U s e r u ' a d m i n ' > , < U s e r u ' g u e s t ' > ] < U s e r u ' a d m i n ' > u n i c o d e ( ' a b c d e f ' ) -> u ' a b c d e f ' u ' h e l l o w o r l d ' . e n c o d e ( ' u t f - 8 ' ) or s t r ( u ' h e l l o w o r l d ' ) 4 / 20
  3. Example #2 3 1 a d m i n @

    e x a m p l e . c o m T r u e [ < U s e r u ' a d m i n ' > , < U s e r u ' g u e s t ' > ] [ < U s e r u ' a d m i n ' > , < U s e r u ' g u e s t ' > ] [ < U s e r u ' a d m i n ' > , < U s e r u ' g u e s t ' > ] [ < U s e r u ' a d m i n ' > ] < U s e r u ' a d m i n ' > This will raise 404 errors instead of returning None: g e t _ o r _ 4 0 4 ( ) or f i r s t _ o r _ 4 0 4 ( ) (for view functions) d b . c r e a t e _ a l l ( ) a d m i n = U s e r ( ' a d m i n ' , ' a d m i n @ e x a m p l e . c o m ' ) g u e s t = U s e r ( ' g u e s t ' , ' g u e s t @ e x a m p l e . c o m ' ) m e = U s e r ( ' m e ' , ' m e @ e x a m p l e . c o m ' ) d b . s e s s i o n . a d d ( a d m i n ) d b . s e s s i o n . a d d ( g u e s t ) d b . s e s s i o n . a d d ( m e ) d b . s e s s i o n . c o m m i t ( ) p r i n t m e . i d # a f t e r c o m m i t d b . s e s s i o n . d e l e t e ( m e ) d b . s e s s i o n . c o m m i t ( ) a d m i n = U s e r . q u e r y . f i l t e r _ b y ( u s e r n a m e = ' a d m i n ' ) . f i r s t ( ) p r i n t a d m i n . i d p r i n t a d m i n . e m a i l m i s s i n g = U s e r . q u e r y . f i l t e r _ b y ( u s e r n a m e = ' m i s s i n g ' ) . f i r s t ( ) p r i n t m i s s i n g i s N o n e p r i n t U s e r . q u e r y . a l l ( ) p r i n t U s e r . q u e r y . f i l t e r ( U s e r . e m a i l . e n d s w i t h ( ' @ e x a m p l e . c o m ' ) ) . a p r i n t U s e r . q u e r y . o r d e r _ b y ( U s e r . u s e r n a m e ) . a l l ( ) p r i n t U s e r . q u e r y . l i m i t ( 1 ) . a l l ( ) # 1 u s e r p r i n t U s e r . q u e r y . g e t ( 1 ) # b y p r i m a r y k e y 5 / 20
  4. f r o m f l a s k i

    m p o r t F l a s k f r o m f l a s k . e x t . s q l a l c h e m y i m p o r t S Q L A l c h e m y # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) a p p . c o n f i g [ ' S Q L A L C H E M Y _ D A T A B A S E _ U R I ' ] = ' s q l i t e : / / / t e s t . d b ' a p p . c o n f i g [ ' S Q L A L C H E M Y _ T R A C K _ M O D I F I C A T I O N S ' ] = T r u e d b = S Q L A l c h e m y ( a p p ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s P e r s o n ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) n a m e = d b . C o l u m n ( d b . S t r i n g ( 5 0 ) ) a d d r e s s e s = d b . r e l a t i o n s h i p ( ' A d d r e s s ' , b a c k r e f = ' p e r s o n ' , l a z y = d e f _ _ i n i t _ _ ( s e l f , n a m e ) : s e l f . n a m e = n a m e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < P e r s o n % r > ' % s e l f . n a m e c l a s s A d d r e s s ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) e m a i l = d b . C o l u m n ( d b . S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) p e r s o n _ i d = d b . C o l u m n ( d b . I n t e g e r , d b . F o r e i g n K e y ( ' p e r s o n . i d ' # p e r s o n = d b . r e l a t i o n s h i p ( ' P e r s o n ' , b a c k r e f = d b . b a c k r e f ( ' a d d r e s s e s ' , l a z y = ' d y n a m i c ' ) ) d e f _ _ i n i t _ _ ( s e l f , e m a i l , p e r s ) : s e l f . e m a i l = e m a i l s e l f . p e r s o n _ i d = p e r s . i d d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < A d d r e s s % r > ' % s e l f . e m a i l Example #3 How does it know that this will return more than one address? Because SQLAlchemy guesses a useful default from your declaration. If you would want to have a one-to-one relationship you can pass u s e l i s t = F a l s e to r e l a t i o n s h i p ( ) . Two possibilities (TBT) See: Declaring Models 7 / 20
  5. Example #3 [ < A d d r e s

    s u ' o t o n g @ e x a m p l e . c o m ' > , < A d d r e s s u ' o t o n g @ n a s a . c o m ' < A d d r e s s u ' o t o n g @ e x a m p l e . c o m ' > [ < A d d r e s s u ' u j a n g @ e x a m p l e . c o m ' > ] < P e r s o n u ' o t o n g ' > d b . c r e a t e _ a l l ( ) o t o n g = P e r s o n ( ' o t o n g ' ) u j a n g = P e r s o n ( ' u j a n g ' ) d b . s e s s i o n . a d d ( o t o n g ) d b . s e s s i o n . a d d ( u j a n g ) d b . s e s s i o n . c o m m i t ( ) o t o n g e m a i l 1 = A d d r e s s ( ' o t o n g @ e x a m p l e . c o m ' , o t o n g ) o t o n g e m a i l 2 = A d d r e s s ( ' o t o n g @ n a s a . c o m ' , o t o n g ) u j a n g e m a i l = A d d r e s s ( ' u j a n g @ e x a m p l e . c o m ' , u j a n g ) d b . s e s s i o n . a d d ( o t o n g e m a i l 1 ) d b . s e s s i o n . a d d ( o t o n g e m a i l 2 ) d b . s e s s i o n . a d d ( u j a n g e m a i l ) d b . s e s s i o n . c o m m i t ( ) p r i n t o t o n g . a d d r e s s e s . a l l ( ) p r i n t o t o n g . a d d r e s s e s . f i r s t ( ) p r i n t u j a n g . a d d r e s s e s . a l l ( ) p r i n t o t o n g e m a i l 1 . p e r s o n 8 / 20
  6. Example #4 Page.tags : a list of tags once loaded

    Tag.pages : a dynamic backref Declaring Models — Flask-SQLAlchemy Documentation Many to Many Relationships with Flask-SQLALchemy Basic Relationship Patterns — SQLAlchemy f r o m f l a s k i m p o r t F l a s k f r o m f l a s k . e x t . s q l a l c h e m y i m p o r t S Q L A l c h e m y # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) a p p . c o n f i g [ ' S Q L A L C H E M Y _ D A T A B A S E _ U R I ' ] = ' s q l i t e : / / / t e s t . d b ' a p p . c o n f i g [ ' S Q L A L C H E M Y _ T R A C K _ M O D I F I C A T I O N S ' ] = T r u e d b = S Q L A l c h e m y ( a p p ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - t a g s = d b . T a b l e ( ' t a g s ' , d b . C o l u m n ( ' t a g _ i d ' , d b . I n t e g e r , d b . F o r e i g n K e y ( ' t a g . i d ' ) ) , d b . C o l u m n ( ' p a g e _ i d ' , d b . I n t e g e r , d b . F o r e i g n K e y ( ' p a g e . i d ' ) c l a s s P a g e ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) t i t l e = d b . C o l u m n ( d b . S t r i n g ( 8 0 ) ) b o d y = d b . C o l u m n ( d b . T e x t ) t a g s = d b . r e l a t i o n s h i p ( ' T a g ' , s e c o n d a r y = t a g s , b a c k r e f = d b . b d e f _ _ i n i t _ _ ( s e l f , t i t l e ) : s e l f . t i t l e = t i t l e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < P a g e % r > ' % s e l f . t i t l e c l a s s T a g ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) l a b e l = d b . C o l u m n ( d b . S t r i n g ( 5 0 ) ) d e f _ _ i n i t _ _ ( s e l f , l a b e l ) : s e l f . l a b e l = l a b e l d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < T a g % r > ' % s e l f . l a b e l 9 / 20
  7. d b . c r e a t e _

    a l l ( ) t a g p y t h o n = T a g ( ' p y t h o n ' ) t a g t u t s = T a g ( ' t u t o r i a l ' ) t a g j a v a = T a g ( ' j a v a ' ) d b . s e s s i o n . a d d ( t a g p y t h o n ) d b . s e s s i o n . a d d ( t a g j a v a ) d b . s e s s i o n . a d d ( t a g t u t s ) # d b . s e s s i o n . c o m m i t ( ) p a g e p y t h o n 1 = P a g e ( ' p a g e p y t h o n 1 ' ) p a g e p y t h o n 2 = P a g e ( ' p a g e p y t h o n 2 ' ) p a g e j a v a = P a g e ( ' p a g e j a v a ' ) d b . s e s s i o n . a d d ( p a g e p y t h o n 1 ) d b . s e s s i o n . a d d ( p a g e p y t h o n 2 ) d b . s e s s i o n . a d d ( p a g e j a v a ) # d b . s e s s i o n . c o m m i t ( ) p a g e p y t h o n 1 . t a g s . a p p e n d ( t a g p y t h o n ) p a g e p y t h o n 1 . t a g s . a p p e n d ( t a g t u t s ) p a g e p y t h o n 2 . t a g s . a p p e n d ( t a g p y t h o n ) p a g e j a v a . t a g s . a p p e n d ( t a g j a v a ) d b . s e s s i o n . c o m m i t ( ) p r i n t t a g p y t h o n . p a g e s . a l l ( ) p r i n t p a g e p y t h o n 1 . t a g s Example #4 [ < P a g e u ' p a g e p y t h o n 1 ' > , < P a g e u ' p a g e p y t h o n 2 ' > ] [ < T a g u ' t u t o r i a l ' > , < T a g u ' p y t h o n ' > ] 10 / 20
  8. Example #5 f r o m d a t e

    t i m e i m p o r t d a t e t i m e f r o m f l a s k i m p o r t F l a s k f r o m f l a s k . e x t . s q l a l c h e m y i m p o r t S Q L A l c h e m y # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) a p p . c o n f i g [ ' S Q L A L C H E M Y _ D A T A B A S E _ U R I ' ] = ' s q l i t e : / / / t e s t . d b ' a p p . c o n f i g [ ' S Q L A L C H E M Y _ T R A C K _ M O D I F I C A T I O N S ' ] = T r u e d b = S Q L A l c h e m y ( a p p ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s P o s t ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) t i t l e = d b . C o l u m n ( d b . S t r i n g ( 8 0 ) ) b o d y = d b . C o l u m n ( d b . T e x t ) p u b _ d a t e = d b . C o l u m n ( d b . D a t e T i m e ) c a t e g o r y _ i d = d b . C o l u m n ( d b . I n t e g e r , d b . F o r e i g n K e y ( ' c a t e g o r y . i d ' c a t e g o r y = d b . r e l a t i o n s h i p ( ' C a t e g o r y ' , b a c k r e f = d b . b a c k r e f ( d e f _ _ i n i t _ _ ( s e l f , t i t l e , b o d y , c a t e g o r y , p u b _ d a t e = N o n e ) s e l f . t i t l e = t i t l e s e l f . b o d y = b o d y i f p u b _ d a t e i s N o n e : p u b _ d a t e = d a t e t i m e . u t c n o w ( ) s e l f . p u b _ d a t e = p u b _ d a t e s e l f . c a t e g o r y = c a t e g o r y d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < P o s t % r > ' % s e l f . t i t l e c l a s s C a t e g o r y ( d b . M o d e l ) : i d = d b . C o l u m n ( d b . I n t e g e r , p r i m a r y _ k e y = T r u e ) n a m e = d b . C o l u m n ( d b . S t r i n g ( 5 0 ) ) d e f _ _ i n i t _ _ ( s e l f , n a m e ) : s e l f . n a m e = n a m e d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < C a t e g o r y % r > ' % s e l f . n a m e # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d b . c r e a t e _ a l l ( ) p y = C a t e g o r y ( ' P y t h o n ' ) p = P o s t ( ' H e l l o P y t h o n ! ' , ' P y t h o n i s p r e t t y c o o l ' , p y ) d b . s e s s i o n . a d d ( p y ) d b . s e s s i o n . a d d ( p ) d b . s e s s i o n . c o m m i t ( ) # j o u r n a l ? p r i n t p y . p o s t s p r i n t p y . p o s t s . a l l ( ) S E L E C T p o s t . i d A S p o s t _ i d , p o s t . t i t l e A S p o s t _ t i t l e , p o s t . b o d y [ < P o s t u ' H e l l o P y t h o n ! ' > ] 11 / 20
  9. Example #6 database.py f r o m s q l

    a l c h e m y i m p o r t c r e a t e _ e n g i n e f r o m s q l a l c h e m y . o r m i m p o r t s c o p e d _ s e s s i o n , s e s s i o n m a k e r f r o m 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 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - e n g i n e = c r e a t e _ e n g i n e ( ' s q l i t e : / / / t e s t . d b ' , c o n v e r t _ u n i c o d e = d b _ s e s s i o n = s c o p e d _ s e s s i o n ( s e s s i o n m a k e r ( a u t o c o m m i t = F a l s e , a u t o f l u s h = F a l s e , b i n d = e n g i n e ) ) B a s e = d e c l a r a t i v e _ b a s e ( ) B a s e . q u e r y = d b _ s e s s i o n . q u e r y _ p r o p e r t y ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d e f i n i t _ d b ( ) : i m p o r t m o d e l s B a s e . m e t a d a t a . c r e a t e _ a l l ( b i n d = e n g i n e ) models.py f r o m s q l a l c h e m y i m p o r t C o l u m n , I n t e g e r , S t r i n g f r o m d a t a b a s e i m p o r t B a s e # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - c l a s s U s e r ( B a s e ) : _ _ t a b l e n a m e _ _ = ' u s e r s ' i d = C o l u m n ( I n t e g e r , p r i m a r y _ k e y = T r u e ) n a m e = C o l u m n ( S t r i n g ( 5 0 ) , u n i q u e = T r u e ) e m a i l = C o l u m n ( S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) d e f _ _ i n i t _ _ ( s e l f , n a m e = N o n e , e m a i l = N o n e ) : s e l f . n a m e = n a m e s e l f . e m a i l = e m a i l d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < U s e r % r > ' % ( s e l f . n a m e ) 13 / 20
  10. Example #6 [ < U s e r u '

    a d m i n ' > ] < U s e r u ' a d m i n ' > app.py f r o m d a t a b a s e i m p o r t d b _ s e s s i o n , i n i t _ d b f r o m m o d e l s i m p o r t U s e r f r o m f l a s k i m p o r t F l a s k # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - a p p = F l a s k ( _ _ n a m e _ _ ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ a p p . t e a r d o w n _ a p p c o n t e x t d e f s h u t d o w n _ s e s s i o n ( e x c e p t i o n = N o n e ) : d b _ s e s s i o n . r e m o v e ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - i n i t _ d b ( ) u = U s e r ( ' a d m i n ' , ' a d m i n @ l o c a l h o s t ' ) d b _ s e s s i o n . a d d ( u ) d b _ s e s s i o n . c o m m i t ( ) p r i n t U s e r . q u e r y . a l l ( ) p r i n t U s e r . q u e r y . f i l t e r ( U s e r . n a m e = = ' a d m i n ' ) . f i r s t ( ) 14 / 20
  11. Example #7 database.py f r o m s q l

    a l c h e m y i m p o r t c r e a t e _ e n g i n e f r o m s q l a l c h e m y . o r m i m p o r t s c o p e d _ s e s s i o n , s e s s i o n m a k e r # f r o m 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 f r o m s q l a l c h e m y i m p o r t M e t a D a t a # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - e n g i n e = c r e a t e _ e n g i n e ( ' s q l i t e : / / / t e s t . d b ' , c o n v e r t _ u n i c o d e = d b _ s e s s i o n = s c o p e d _ s e s s i o n ( s e s s i o n m a k e r ( a u t o c o m m i t = F a l s e , a u t o f l u s h = F a l s e , b i n d = e n g i n e ) ) m e t a d a t a = M e t a D a t a ( ) # B a s e = d e c l a r a t i v e _ b a s e ( ) # B a s e . q u e r y = d b _ s e s s i o n . q u e r y _ p r o p e r t y ( ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - d e f i n i t _ d b ( ) : # i m p o r t m o d e l s # B a s e . m e t a d a t a . c r e a t e _ a l l ( b i n d = e n g i n e ) m e t a d a t a . c r e a t e _ a l l ( b i n d = e n g i n e ) models.py f r o m s q l a l c h e m y i m p o r t C o l u m n , I n t e g e r , S t r i n g # f r o m d a t a b a s e i m p o r t B a s e f r o m s q l a l c h e m y i m p o r t T a b l e f r o m s q l a l c h e m y . o r m i m p o r t m a p p e r f r o m d a t a b a s e i m p o r t m e t a d a t a , d b _ s e s s i o n # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # c l a s s U s e r ( B a s e ) : c l a s s U s e r ( o b j e c t ) : # _ _ t a b l e n a m e _ _ = ' u s e r s ' # i d = C o l u m n ( I n t e g e r , p r i m a r y _ k e y = T r u e ) # n a m e = C o l u m n ( S t r i n g ( 5 0 ) , u n i q u e = T r u e ) # e m a i l = C o l u m n ( S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) q u e r y = d b _ s e s s i o n . q u e r y _ p r o p e r t y ( ) d e f _ _ i n i t _ _ ( s e l f , n a m e = N o n e , e m a i l = N o n e ) : s e l f . n a m e = n a m e s e l f . e m a i l = e m a i l d e f _ _ r e p r _ _ ( s e l f ) : r e t u r n ' < U s e r % r > ' % ( s e l f . n a m e ) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - u s e r s = T a b l e ( ' u s e r s ' , m e t a d a t a , C o l u m n ( ' i d ' , I n t e g e r , p r i m a r y _ k e y = T r u e ) , C o l u m n ( ' n a m e ' , S t r i n g ( 5 0 ) , u n i q u e = T r u e ) , C o l u m n ( ' e m a i l ' , S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) ) m a p p e r ( U s e r , u s e r s ) 16 / 20
  12. f r o m s q l a l c

    h e m y i m p o r t c r e a t e _ e n g i n e , M e t a D a t a f r o m s q l a l c h e m y i m p o r t T a b l e , C o l u m n , I n t e g e r , S t r i n g e n g i n e = c r e a t e _ e n g i n e ( ' s q l i t e : / / / t e s t . d b ' , c o n v e r t _ u n i c o d e = m e t a d a t a = M e t a D a t a ( b i n d = e n g i n e ) u s e r s = T a b l e ( ' u s e r s ' , m e t a d a t a , C o l u m n ( ' i d ' , I n t e g e r , p r i m a r y _ k e y = T r u e ) , C o l u m n ( ' n a m e ' , S t r i n g ( 5 0 ) , u n i q u e = T r u e ) , C o l u m n ( ' e m a i l ' , S t r i n g ( 1 2 0 ) , u n i q u e = T r u e ) ) m e t a d a t a . c r e a t e _ a l l ( b i n d = e n g i n e ) # u s e r s = T a b l e ( ' u s e r s ' , m e t a d a t a , a u t o l o a d = T r u e ) # i f p r e v i o u s l y e x i s t s c o n = e n g i n e . c o n n e c t ( ) c o n . e x e c u t e ( u s e r s . i n s e r t ( ) , n a m e = ' a d m i n ' , e m a i l = ' a d m i n @ l o c a l h o s t ' # S Q L A l c h e m y w i l l a u t o m a t i c a l l y c o m m i t f o r u s . p r i n t u s e r s . s e l e c t ( u s e r s . c . i d = = 1 ) . e x e c u t e ( ) . f i r s t ( ) r = u s e r s . s e l e c t ( u s e r s . c . i d = = 1 ) . e x e c u t e ( ) . f i r s t ( ) p r i n t r [ ' n a m e ' ] p r i n t e n g i n e . e x e c u t e ( ' s e l e c t * f r o m u s e r s w h e r e i d = : 1 ' , [ 1 Example #8 ( 1 , u ' a d m i n ' , u ' a d m i n @ l o c a l h o s t ' ) a d m i n ( 1 , u ' a d m i n ' , u ' a d m i n @ l o c a l h o s t ' ) 18 / 20