SQLAlchemy
Oryginalni autorzy | Michał Bajer |
---|---|
Pierwsze wydanie | 14 lutego 2006 |
Wersja stabilna | 1.4.45 / 10 grudnia 2022
|
Magazyn | |
Napisane w | Pyton |
System operacyjny | Międzyplatformowe |
Typ | Mapowanie obiektowo-relacyjne |
Licencja | Licencja MIT |
Strona internetowa |
|
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
- Prezent, Noe (12 sierpnia 2008). „Korzystanie z SQLAlchemy” . Prace deweloperskie . IBM . Źródło 8 lutego 2011 r .
- Rick Copeland, Essential SQLAlchemy, O'Reilly , 2008, ISBN 0-596-51614-2