SQLAlchemy

SQLAlchemy
Oryginalni autorzy Michał Bajer
Pierwsze wydanie 14 lutego 2006 ; 17 lat temu ( 14.02.2006 )
Wersja stabilna
1.4.45 / 10 grudnia 2022 ; 3 miesiące temu ( 2022-12-10 )
Magazyn
Napisane w Pyton
System operacyjny Międzyplatformowe
Typ Mapowanie obiektowo-relacyjne
Licencja Licencja MIT
Strona internetowa www.sqlalchemy.org _ _  Edit this on Wikidata
Mike Bayer mówi o SQLAlchemy na PyCon 2012

SQLAlchemy to zestaw narzędzi SQL typu open source i mapper obiektowo-relacyjny (ORM) dla języka programowania Python wydany na licencji MIT .

Opis

Filozofia SQLAlchemy polega na tym, że relacyjne bazy danych zachowują się mniej jak kolekcje obiektów, gdy skala jest większa, a wydajność zaczyna być problemem, podczas gdy kolekcje obiektów zachowują się mniej jak tabele i wiersze, ponieważ zaprojektowano w nich więcej abstrakcji. Z tego powodu przyjęto wzorzec odwzorowywania danych (podobny do Hibernate dla Javy ) zamiast wzorca aktywnego rekordu używanego przez wiele innych mapowań obiektowo-relacyjnych.

Historia

SQLAlchemy został wydany po raz pierwszy w lutym 2006 roku

Przykład

Poniższy przykład przedstawia relację n-do-1 między filmami a ich reżyserami. Pokazano, w jaki sposób zdefiniowane przez użytkownika Pythona tworzą odpowiednie tabele bazy danych, w jaki sposób tworzone są instancje z relacjami z obu stron relacji, a na koniec, w jaki sposób można wyszukiwać dane — ilustrując automatycznie generowane zapytania SQL dla leniwego i przyspieszonego ładowania.

Definicja schematu

Tworzenie dwóch klas Pythona i odpowiadających im tabel bazy danych w DBMS:

   
   
    

  

 
      

       
      from  sqlalchemy  import  *  from  sqlalchemy.ext.declarative  import  declarative_base  from  sqlalchemy.orm  relacja  importu  ,  sessionmaker  Base  =  declarative_base  ()  class  Movie  (  Base  ):  __tablename__  =  "movies"  id  =  Column  (  Integer  ,  primary_key  =  True  )  title  =   
      
       

        

     Column  (  String  (  255  ),  nullable  =  False  )  year  =  Column  (  Integer  )  directed_by  =  Column  (  Integer  ,  ForeignKey  (  "directors.id"  ))  dyrektor  =  relacja  (  "Director"  ,  backref  =  "movies"  ,  lazy  =  False  )  pok    
          
          

     
              __init__  (  self  ,  tytuł  =  Brak  ,  rok  =  Brak  ):  self  .  tytuł  =  sam  tytuł  .  year  =  year  def  __repr__  (  self  ):  return  „Film (  % r  ,  % r  ,  % r  )”  %  (  self  .  title  ,  self  .  year  ,  self 

 
      

       
        

       .  dyrektor  )  class  Dyrektor  (  Base  ):  __tablename__  =  "directors"  id  =  Column  (  Integer  ,  primary_key  =  True  )  name  =  Column  (  String  (  50  ),  nullable  =  False  ,  unique  =  True  )  def  __init__  (  self  ,  name  = 
          

     
           

  
 Brak  ):  sam  .  name  =  name  def  __repr__  (  self  ):  return  "Director(  %r  )"  %  (  self  .  name  )  engine  =  create_engine  (  "dbms://user:pwd@host/nazwa bazy danych"  )  Base  .  metadane  .  create_all  (  silnik  ) 

Wstawianie danych

Relację reżyser-film można wstawić za pośrednictwem dowolnej jednostki:

  
  

   
  

  
   Session  =  sessionmaker  (  bind  =  engine  )  session  =  Session  ()  m1  =  Movie  (  "Robocop"  ,  1987  )  m1  .  reżyser  =  reżyser  (  "Paul Verhoeven"  )  d2  =  reżyser  (  "George Lucas"  )  d2  .  filmy  =  [  Film  (    


    
    
    

     "Gwiezdne wojny"  ,  1977  ),  film  (  "THX 1138"  ,  1971  )]  spróbuj  :  sesja  .  dodaj  (  m1  )  sesję  .  dodaj  (  d2  )  sesję  .  commit  ()  z wyjątkiem  :  session  .  wycofanie  () 

zapytanie

  
   
     wszystkie dane  =  sesja  .  zapytanie  (  film  )  .  all  ()  for  somedata  in  alldata  :  print  (  somedata  ) 

SQLAlchemy wysyła następujące zapytanie do DBMS (pomijając aliasy):

      
          WYBIERZ  filmy  .  identyfikator  ,  filmy  .  tytuł  ,  filmy  .  rok  ,  filmy  .  kierowane_przez  ,  dyrektorzy  .  id  ,  dyrektorzy  .  nazwa  OD  filmów  LEFT  OUTER  JOIN  reżyserzy  ON  reżyserzy  .  identyfikator  =  filmy  .  w reżyserii 

Wyjście:

  
  
   Film  (  „Robocop”  ,  1987  L  ,  reżyser  (  „Paul Verhoeven”  ))  Film  (  „Gwiezdne wojny”  ,  1977  L  ,  reżyser  (  „George Lucas”  ))  Film  (  „THX 1138”  ,  1971  L  ,  reżyser  (  „George Lucas”) '  )) 

Ustawiając lazy=True (domyślnie), SQLAlchemy najpierw wysyła zapytanie, aby uzyskać listę filmów i tylko wtedy, gdy jest to potrzebne (leniwe), dla każdego reżysera zapytanie, aby uzyskać nazwę odpowiedniego reżysera:

    
 

  
 
    WYBIERZ  filmy  .  identyfikator  ,  filmy  .  tytuł  ,  filmy  .  rok  ,  filmy  .  wyreżyserowane_by  Z  filmów  WYBIERZ  reżyserów  .  id  ,  dyrektorzy  .  nazwa  OD  dyrektorów  GDZIE  dyrektorów  .  id  =  %  s 

Zobacz też

Notatki

Linki zewnętrzne