SQLAlchemy - SQLAlchemy

SQLAlchemy
Autor (es) original (es) Michael Bayer
Versión inicial 14 de febrero de 2006 ; hace 15 años  ( 14/02/2006 )
Lanzamiento estable
1.4.15 / 11 de mayo de 2021 ; Hace 6 días  ( 05/11/2021 )
Repositorio Edita esto en Wikidata
Escrito en Pitón
Sistema operativo Multiplataforma
Tipo Mapeo relacional de objetos
Licencia Licencia MIT
Sitio web www .sqlalchemy .org  Edita esto en Wikidata
Mike Bayer hablando sobre SQLAlchemy en PyCon 2012

SQLAlchemy es un conjunto de herramientas SQL de código abierto y un mapeador relacional de objetos (ORM) para el lenguaje de programación Python publicado bajo la licencia MIT .

Descripción

La filosofía de SQLAlchemy es que las bases de datos relacionales se comportan menos como colecciones de objetos a medida que la escala aumenta y el rendimiento comienza a ser una preocupación, mientras que las colecciones de objetos se comportan menos como tablas y filas a medida que se diseña más abstracción en ellas. Por esta razón, ha adoptado el patrón de mapeador de datos (similar a Hibernate para Java ) en lugar del patrón de registro activo utilizado por otros mapeadores relacionales de objetos. Sin embargo, los complementos opcionales permiten a los usuarios desarrollar utilizando una sintaxis declarativa.

Historia

SQLAlchemy se lanzó por primera vez en febrero de 2006 y rápidamente se ha convertido en una de las herramientas de mapeo relacional de objetos más utilizadas en la comunidad de Python, junto con el ORM de Django .

Ejemplo

El siguiente ejemplo representa una relación n-a-1 entre las películas y sus directores. Se muestra cómo las clases de Python definidas por el usuario crean las tablas de base de datos correspondientes, cómo se crean instancias con relaciones desde ambos lados de la relación y, finalmente, cómo se pueden consultar los datos, lo que ilustra consultas SQL generadas automáticamente para carga lenta y ansiosa.

Definición de esquema

Creando dos clases de Python y según las tablas de la base de datos en el 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)

Inserción de datos

Se puede insertar una relación director-película a través de cualquiera de las 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 la siguiente consulta al DBMS (omitiendo los 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

La salida:

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

Configurando lazy=True (predeterminado) en cambio, SQLAlchemy primero emitiría una consulta para obtener la lista de películas y solo cuando fuera necesario (perezoso) para cada director una consulta para obtener el nombre del director correspondiente:

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

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

Ver también

Referencias

Notas

enlaces externos