SQLAlchemy - SQLAlchemy
| Originalförfattare | Michael Bayer |
|---|---|
| Första utgåvan | 14 februari 2006 |
| Stabil frisättning | 1.4.15 / 11 maj 2021
|
| Förvar |
|
| Skrivet i | Pytonorm |
| Operativ system | Tvärplattform |
| Typ | Objektrelationell kartläggning |
| Licens | MIT-licens |
| Hemsida |
www |
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
- Present, Noah (12 augusti 2008). "Använda SQLAlchemy" . Utvecklararbeten . IBM . Hämtad 8 feb 2011 . CS1 maint: avskräckt parameter ( länk )
- Rick Copeland, Essential SQLAlchemy, O'Reilly , 2008, ISBN 0-596-51614-2