SQLAlchemy - SQLAlchemy

SQLAlchemy
Originalförfattare Michael Bayer
Första utgåvan 14 februari 2006 ; 15 år sedan  ( 2006-02-14 )
Stabil frisättning
1.4.15 / 11 maj 2021 ; 6 dagar sen  ( 2021-05-11 )
Förvar Redigera detta på Wikidata
Skrivet i Pytonorm
Operativ system Tvärplattform
Typ Objektrelationell kartläggning
Licens MIT-licens
Hemsida www .sqlalchemy .org  Redigera detta på Wikidata
Image
Mike Bayer pratar om SQLAlchemy på PyCon 2012

SQLAlchemy är en öppen källkod för SQL- verktyg och objektrelationskartläggare (ORM) för Python-programmeringsspråket som släpptes under MIT-licensen .

Beskrivning

SQLAlchemys filosofi är att relationsdatabaser beter sig mindre som objektsamlingar när skalan blir större och prestanda börjar vara ett problem, medan objektsamlingar beter sig mindre som tabeller och rader eftersom mer abstraktion designas in i dem. Av denna anledning har den antagit datakartmönstret (liknar Hibernate för Java ) snarare än det aktiva postmönstret som används av ett antal andra objektrelationskartor. Valfria tillägg tillåter dock användare att utveckla med deklarativ syntax.

Historia

SQLAlchemy släpptes första gången i februari 2006 och har snabbt blivit en av de mest använda objektrelations kartläggning verktyg i Python samhället, tillsammans med Django 's ORM .

Exempel

Följande exempel representerar ett n-till-1-förhållande mellan filmer och deras regissörer. Det visas hur användardefinierade Python- klasser skapar motsvarande databastabeller, hur instanser med relationer skapas från vardera sidan av relationen och slutligen hur data kan ifrågasättas - vilket visar automatiskt genererade SQL- frågor för både lat och ivrig laddning.

Schemadefinition

Skapa två Python-klasser och enligt databastabeller i DBMS:

from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, 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"))

    director = relation("Director", backref="movies", lazy=False)

    def __init__(self, title=None, year=None):
        self.title = title
        self.year = year

    def __repr__(self):
        return "Movie(%r, %r, %r)" % (self.title, self.year, self.director)

class Director(Base):
    __tablename__ = "directors"

    id = Column(Integer, primary_key=True)
    name = Column(String(50), nullable=False, unique=True)

    def __init__(self, name=None):
        self.name = name

    def __repr__(self):
        return "Director(%r)" % (self.name)

engine = create_engine("dbms://user:pwd@host/dbname")
Base.metadata.create_all(engine)

Datainsättning

Man kan infoga en regissör-film-relation via endera enheten:

Session = sessionmaker(bind=engine)
session = Session()

m1 = Movie("Robocop", 1987)
m1.director = Director("Paul Verhoeven")

d2 = Director("George Lucas")
d2.movies = [Movie("Star Wars", 1977), Movie("THX 1138", 1971)]

try:
    session.add(m1)
    session.add(d2)
    session.commit()
except:
    session.rollback()

Fråga

alldata = session.query(Movie).all()
for somedata in alldata:
    print(somedata)

SQLAlchemy utfärdar följande fråga till DBMS (utelämnar alias):

SELECT movies.id, movies.title, movies.year, movies.directed_by, directors.id, directors.name
FROM movies LEFT OUTER JOIN directors ON directors.id = movies.directed_by

Utgången:

Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))

Inställning lazy=True (standard) i stället, SQLAlchemy skulle först utfärda en fråga för att få en lista över filmer och endast vid behov (lat) för varje regissör en fråga för att få namnet på motsvarande regissör:

SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies

SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s

Se även

Referenser

Anteckningar

externa länkar