SQLAlchemy – Wikipédia, a enciclopédia livre

SQLAlchemy
Desenvolvedor Michael Bayer[1]
Versão estável 2.0.29 (23 de março de 2024; há 6 meses[2])
Escrito em Python
Sistema operacional Multiplataforma
Gênero(s) Mapeamento objeto-relacional
Licença MIT
Página oficial www.sqlalchemy.org
Repositório sqlalchemy no GitHub

SQLAlchemy é uma biblioteca de mapeamento objeto-relacional SQL em código aberto desenvolvido para a linguagem de programação Python e disponibilizado sobre a licença MIT.[3]

O SQLAlchemy fornece "um conjunto completo e bem conhecido de modelos de persistência de nível corporativo, projetado para eficiência e alta performance de acesso a banco de dados, adaptado em uma linguagem de domínio simples e Pytônica". Sua filosofia é que bancos de dados SQL se comportem cada vez menos como coleções de objetos, em que mais tamanho e performance comecem a importar, enquanto coleções de objeto se comportem cada vez menos como tabelas e linhas, no qual mais abstração começa a importar. Por esta razão o SQLAlchemy adotou o padrão mapeador de dados (como o Hibernate para Java) em vez do padrão de registro ativo usado por vários outros mapeadores objeto-relacional.[4] Entretanto, plugins adicionais como Elixir e declarative permitem aos usuários desenvolverem usando sintaxe declarativa.

O SQLAlchemy foi lançado em fevereiro de 2006 e rapidamente se tornou uma das ferramentas de mapeamento objeto-relacional mais utilizadas juntamente com o ORM do Django, na comunidade Python.

O exemplo que se segue representa um relacionamento n-para-1 entre filmes e seus diretores. É mostrado como classes Python definidas pelo usuário criam as tabelas de banco de dados adequadas, como instâncias com relacionamentos são criadas a partir de ambos os lados da relação e, finalmente, como os dados podem ser consultados - ilustrando consultas SQL geradas automaticamente para o carregamento preguiçoso (lazy) e ansioso (eager).

Definição de esquema

[editar | editar código-fonte]

Criando duas classes Python e suas relativas tabelas de banco de dados no SGBD:

from sqlalchemy import * from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relation, sessionmaker  Base = declarative_base()   class Filme(Base):     __tablename__ = 'filmes'       id = Column(Integer, primary_key=True)     titulo = Column(String(255), nullable=False)     ano = Column(Integer)     dirigido_por = Column(Integer, ForeignKey('diretores.id'))       diretor = relation("Diretor", backref='filmes', lazy=False)       def __init__(self, titulo=None, ano=None):         self.titulo = titulo         self.ano = ano     def __repr__(self):         return "Filme(%r, %r, %r)" % (self.titulo, self.ano, self.diretor)   class Diretor(Base):     __tablename__ = 'diretores'       id = Column(Integer, primary_key=True)     nome = Column(String(50), nullable=False, unique=True)       def __init__(self, nome=None):         self.nome = nome       def __repr__(self):         return "Diretor(%r)" % (self.nome)   engine = create_engine('dbms://user:pwd@host/dbname') Base.metadata.create_all(engine) 

Inserção de dados

[editar | editar código-fonte]

A inserção de filmes e seus diretores pode ser alcançada através das duas entidades:

Session = sessionmaker(bind=engine) session = Session()  f1 = Filme("Star Trek", 2009) f1.diretor = Diretor("JJ Abrams")  d2 = Diretor("George Lucas") d2.filmes = [Filme("Guerra nas Estrelas", 1977), Filme("THX 1138", 1971)]  try:     session.add(f1)     session.add(d2)     session.commit() except:     session.rollback() 
alldata = session.query(Filme).all() for somedata in alldata:     print somedata 

O SQLAlchemy envia a seguinte consulta para o SGBD (omitindo os apelidos - aliases):

SELECT filmes.id, filmes.titulo, filmes.ano, filmes.dirigido_por, diretores.id, diretores.nome  FROM filmes LEFT OUTER JOIN diretores ON diretores.id = filmes.dirigido_por 

A saída:

Filme('Star Trek', 2009L, Diretor('JJ Abrams')) Filme('Guerra nas Estrelas', 1977L, Diretor('George Lucas')) Filme('THX 1138', 1971L, Diretor('George Lucas')) 

Definindo lazy=True (padrão), o SQLAlchemy primeiro enviaria uma consulta para obter a lista de filmes e apenas quando necessário (preguiçoso - lazy) para cada diretor uma consulta para obter o nome do diretor correspondente:

SELECT filmes.id, filmes.titulo, filmes.ano, filmes.dirigido_por  FROM filmes  SELECT diretores.id, diretores.nome FROM diretores  WHERE diretores.id = %s 

Referências

  1. Mike Bayer é o criador do SQLAlchemy e Mako Templates para Python.
  2. «Release SQLAlchemy 2.0.29». github.com (em inglês). 23 de março de 2024. Consultado em 2 de maio de 2024 
  3. «LICENSE». bitbucket.org (em inglês). Consultado em 24 de novembro de 2015 
  4. em A arquitetura de aplicações de código aberto

Ligações externas

[editar | editar código-fonte]