SQLAlchemy - SQLAlchemy
Autor (es) original (is) | Michael Bayer |
---|---|
lançamento inicial | 14 de fevereiro de 2006 |
Versão estável | 1.4.15 / 11 de maio de 2021
|
Repositório | |
Escrito em | Pitão |
Sistema operacional | Plataforma cruzada |
Modelo | Mapeamento objeto-relacional |
Licença | Licença MIT |
Local na rede Internet |
www |
SQLAlchemy é um kit de ferramentas SQL de código aberto e mapeador objeto-relacional (ORM) para a linguagem de programação Python lançado sob a licença MIT .
Descrição
A filosofia do SQLAlchemy é que os bancos de dados relacionais se comportam menos como coleções de objetos conforme a escala fica maior e o desempenho começa a ser uma preocupação, enquanto as coleções de objetos se comportam menos como tabelas e linhas, pois mais abstração é projetada neles. Por esse motivo, ele adotou o padrão do mapeador de dados (semelhante ao Hibernate para Java ) em vez do padrão de registro ativo usado por vários outros mapeadores relacionais de objetos. No entanto, plug-ins opcionais permitem que os usuários desenvolvam usando sintaxe declarativa.
História
SQLAlchemy foi lançado pela primeira vez em fevereiro de 2006 e rapidamente se tornou uma das ferramentas de mapeamento objeto-relacional mais amplamente usadas na comunidade Python, junto com o ORM do Django .
Exemplo
O exemplo a seguir representa uma relação n-para-1 entre filmes e seus diretores. É mostrado como classes Python definidas pelo usuário criam tabelas de banco de dados correspondentes, como instâncias com relacionamentos são criadas de qualquer lado do relacionamento e, finalmente, como os dados podem ser consultados - ilustrando consultas SQL geradas automaticamente para carregamento lento e rápido.
Definição de esquema
Criação de duas classes Python e tabelas de banco de dados de acordo no 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)
Inserção de dados
Pode-se inserir uma relação diretor-filme por meio de qualquer uma das entidades:
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()
Consultando
alldata = session.query(Movie).all()
for somedata in alldata:
print(somedata)
SQLAlchemy emite a seguinte consulta ao DBMS (omitindo aliases):
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
A saída:
Movie('Robocop', 1987L, Director('Paul Verhoeven'))
Movie('Star Wars', 1977L, Director('George Lucas'))
Movie('THX 1138', 1971L, Director('George Lucas'))
Definindo lazy=True
(padrão) em vez disso, SQLAlchemy primeiro emitiria uma consulta para obter a lista de filmes e apenas quando necessário (preguiçoso) para cada diretor uma consulta para obter o nome do diretor correspondente:
SELECT movies.id, movies.title, movies.year, movies.directed_by
FROM movies
SELECT directors.id, directors.name
FROM directors
WHERE directors.id = %s
Veja também
Referências
- Notas
- Gift, Noah (12 de agosto de 2008). "Usando SQLAlchemy" . Developerworks . IBM . Retirado em 8 de fevereiro de 2011 . CS1 maint: parâmetro desencorajado ( link )
- Rick Copeland, Essential SQLAlchemy, O'Reilly , 2008, ISBN 0-596-51614-2