SQLAlchemy - SQLAlchemy

SQLAlchemy
Autor (es) original (is) Michael Bayer
lançamento inicial 14 de fevereiro de 2006 ; 15 anos atrás  ( 14/02/2006 )
Versão estável
1.4.15 / 11 de maio de 2021 ; 6 dias atrás  ( 2021-05-11 )
Repositório Edite isso no Wikidata
Escrito em Pitão
Sistema operacional Plataforma cruzada
Modelo Mapeamento objeto-relacional
Licença Licença MIT
Local na rede Internet www .sqlalchemy .org  Edite isso no Wikidata
Mike Bayer falando sobre SQLAlchemy na PyCon 2012

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

links externos