SQLAlchemy - SQLAlchemy
Autor (es) original (es) | Michael Bayer |
---|---|
Versión inicial | 14 de febrero de 2006 |
Lanzamiento estable | 1.4.15 / 11 de mayo de 2021
|
Repositorio | |
Escrito en | Pitón |
Sistema operativo | Multiplataforma |
Tipo | Mapeo relacional de objetos |
Licencia | Licencia MIT |
Sitio web |
www |
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
- Gift, Noah (12 de agosto de 2008). "Usando SQLAlchemy" . Developerworks . IBM . Consultado el 8 de febrero de 2011 . CS1 maint: parámetro desalentado ( enlace )
- Rick Copeland, alquimia esencial de SQLA, O'Reilly , 2008, ISBN 0-596-51614-2