UNI



INTRODUCCIÓN A LA COMPUTACIÓN
Alumno: Sergio Fernando Feliciano Zuñiga
Profesor: Carlos Alberto Janjachi
FIIS-UNI
SQLAlchemy: ¿Qué es y por qué es importante?
¿Qué es SQLAlchemy?
SQLAlchemy es una librería de Python que proporciona una forma flexible y poderosa de interactuar con bases de datos relacionales. Es un mapeador objeto-relacional (ORM) que facilita la comunicación entre una aplicación Python y una base de datos relacional, permitiendo a los desarrolladores trabajar con datos en términos de objetos y clases Python en lugar de consultas SQL directas.
Algunas características clave de SQLAlchemy incluyen:
-
Mapeo Objeto-Relacional (ORM): SQLAlchemy mapea las tablas de la base de datos a clases Python y las filas de esas tablas a instancias de esas clases. Esto permite a los desarrolladores manipular datos de manera más intuitiva utilizando objetos y métodos en lugar de escribir consultas SQL directas.
-
Lenguaje de Expresión SQL (SQL Expression Language): Además del mapeo ORM, SQLAlchemy proporciona un lenguaje de expresión SQL que permite construir consultas SQL de manera programática utilizando objetos y métodos en lugar de cadenas de texto.
-
Manejo de Sesiones: SQLAlchemy maneja sesiones de manera que las transacciones en la base de datos pueden ser gestionadas fácilmente. Esto incluye el inicio de sesiones, la ejecución de consultas y la gestión de transacciones de manera transparente.
-
Soporte para Múltiples Bases de Datos: SQLAlchemy es compatible con varios motores de bases de datos, como PostgreSQL, MySQL, SQLite y Oracle, lo que permite a los desarrolladores cambiar de base de datos sin tener que cambiar drásticamente su código.
-
Flexibilidad en el Esquema de la Base de Datos: Permite definir el esquema de la base de datos utilizando clases y proporciona opciones para personalizar y controlar la creación de tablas, relaciones y otros aspectos del esquema.
​
¿Por qué es importante SQLAlchemy?
SQLAlchemy es importante por varias razones, especialmente cuando trabajas con bases de datos relacionales en aplicaciones Python. Aquí hay algunas razones clave por las cuales SQLAlchemy es considerado importante:
-
Abstracción de Base de Datos: SQLAlchemy proporciona una capa de abstracción sobre la base de datos subyacente. Esto significa que los desarrolladores pueden interactuar con la base de datos utilizando objetos y clases Python en lugar de escribir directamente consultas SQL. Esta abstracción facilita el cambio de base de datos sin tener que realizar cambios significativos en el código de la aplicación.
-
Mapeo Objeto-Relacional (ORM): La capacidad de mapear las tablas de la base de datos a clases Python y las filas a instancias de esas clases simplifica enormemente el manejo de datos. Los desarrolladores pueden trabajar con datos de manera más intuitiva, utilizando objetos y métodos en lugar de consultas SQL directas, lo que mejora la legibilidad y la mantenibilidad del código.
-
Lenguaje de Expresión SQL: Además del mapeo ORM, SQLAlchemy proporciona un lenguaje de expresión SQL que permite construir consultas SQL de manera programática utilizando objetos y métodos en lugar de cadenas de texto. Esto mejora la seguridad y reduce la posibilidad de errores de sintaxis en las consultas.
-
Flexibilidad y Portabilidad: SQLAlchemy es compatible con varios motores de bases de datos, como PostgreSQL, MySQL, SQLite y Oracle. Esto proporciona a los desarrolladores la flexibilidad de elegir el motor de base de datos que mejor se adapte a sus necesidades, y también facilita la portabilidad de la aplicación entre diferentes bases de datos.
-
Control de Transacciones y Sesiones: SQLAlchemy maneja de manera eficiente las transacciones en la base de datos y proporciona un sistema de sesiones que facilita la gestión de operaciones relacionadas con la base de datos. Esto garantiza la integridad de los datos y facilita la implementación de operaciones atómicas.
-
Facilita las Pruebas Unitarias: El mapeo ORM y la abstracción de la base de datos facilitan la escritura de pruebas unitarias para las aplicaciones. Los desarrolladores pueden usar sesiones de prueba y realizar operaciones en una base de datos temporal o en memoria, lo que hace que las pruebas sean más predecibles y eficientes.
-
Community y Documentación: SQLAlchemy tiene una comunidad activa y una documentación sólida. Esto significa que los desarrolladores pueden encontrar ayuda fácilmente, así como recursos para aprender y mejorar sus habilidades con la librería.
​
Para instalar y usar SQLAlchemy en Google Colab, sigue estos pasos:
-
Instalación de SQLAlchemy: Puedes instalar SQLAlchemy utilizando el siguiente comando en una celda de código en Google Colab:
​​​
​
Ejecuta esta celda y espera a que termine la instalación.
-
Importación de SQLAlchemy: Una vez instalado, puedes importar la librería en tus celdas de código utilizando la siguiente línea:
​
Puedes agregar esta línea al principio de tu cuaderno de Colab para asegurarte de que SQLAlchemy esté disponible en todo el cuaderno.
Después de ejecutar estas celdas, tendrás SQLAlchemy instalado y listo para usar en tu entorno de Google Colab. Recuerda que si cierras tu sesión en Google Colab, deberás volver a ejecutar estas celdas la próxima vez que abras un nuevo entorno.
Ventajas de SQLAlchemy:
-
Mapeo Objeto-Relacional (ORM): Proporciona un mapeo sencillo y eficiente entre las clases de objetos en Python y las tablas de la base de datos, facilitando el trabajo con datos de manera orientada a objetos.
-
Abstracción de Base de Datos: Ofrece una capa de abstracción sobre la base de datos, lo que permite a los desarrolladores interactuar con la base de datos mediante objetos y métodos Python en lugar de escribir consultas SQL directas.
-
Soporte para Múltiples Bases de Datos: Es compatible con varios motores de bases de datos, lo que brinda flexibilidad y portabilidad a las aplicaciones al permitir cambios de base de datos sin modificar significativamente el código.
-
Lenguaje de Expresión SQL: SQLAlchemy proporciona un lenguaje de expresión SQL que permite construir consultas SQL de manera programática, lo que mejora la seguridad y reduce errores de sintaxis en las consultas.
-
Gestión de Transacciones y Sesiones: Ofrece un sistema eficiente para gestionar transacciones y sesiones, garantizando la integridad de los datos y facilitando la implementación de operaciones atómicas.
-
Comunidad Activa y Documentación Sólida: Tiene una comunidad activa de desarrolladores y una documentación exhaustiva, lo que facilita el aprendizaje y la resolución de problemas.
-
Facilita las Pruebas Unitarias: La estructura orientada a objetos y la abstracción de la base de datos facilitan la escritura de pruebas unitarias para las aplicaciones.
​


Desventajas de SQLAlchemy:
-
Curva de Aprendizaje: Puede haber una curva de aprendizaje para los principiantes, especialmente aquellos que no están familiarizados con conceptos como ORM.
-
Overhead en el Rendimiento: En comparación con consultas SQL directas, el uso de ORM puede introducir un pequeño overhead en el rendimiento. Sin embargo, para muchas aplicaciones, este costo es insignificante.
-
Complejidad Adicional en Casos Simples: Para aplicaciones simples o consultas sencillas, el uso de SQLAlchemy puede parecer excesivo, ya que introduce una capa adicional de complejidad.
-
Personalización Compleja del Esquema: En algunos casos, la personalización avanzada del esquema de la base de datos puede ser un poco compleja, especialmente para aquellos que son nuevos en SQLAlchemy.
En general, las ventajas de SQLAlchemy superan las desventajas, y es ampliamente utilizado en el desarrollo de aplicaciones Python, especialmente cuando se trabaja con bases de datos relacionales. La elección de usar SQLAlchemy dependerá de los requisitos específicos de tu aplicación y de tu preferencia personal en cuanto al estilo de acceso a la base de datos.
​
EJEMPLO 1:
Celda 1: Importación de Librerías y Definición del Modelo
# Importar librerías
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# Definir la base de datos y el modelo
Base = declarative_base()
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String)
author = Column(String)
genre = Column(String)
year = Column(Integer)
​
Celda 2: Crear la Base de Datos y la Tabla
# Crear la conexión a la base de datos (en memoria para este ejemplo)
engine = create_engine('sqlite:///:memory:')
# Crear la tabla en la base de datos
Base.metadata.create_all(engine)
# Crear una sesión
Session = sessionmaker(bind=engine)
session = Session()
​
Celda 3: Agregar Datos a la Tabla de Libros
# Agregar datos a la tabla de libros
books_data = [
{"title": "To Kill a Mockingbird", "author": "Harper Lee", "genre": "Fiction", "year": 1960},
{"title": "1984", "author": "George Orwell", "genre": "Dystopian", "year": 1949},
{"title": "Pride and Prejudice", "author": "Jane Austen", "genre": "Romance", "year": 1813},
]
books = [Book(**book_data) for book_data in books_data]
session.add_all(books)
session.commit()
Celda 4: Consultas SQL Básicas utilizando SQLAlchemy
# Consultar e imprimir todos los libros
all_books = session.query(Book).all()
print("Todos los libros:")
for book in all_books:
print(f"ID: {book.id}, Title: {book.title}, Author: {book.author}, Year: {book.year}")
# Consultar e imprimir libros de cierto género
genre = "Fiction"
genre_books = session.query(Book).filter_by(genre=genre).all()
print(f"\nLibros de género {genre}:")
for book in genre_books:
print(f"ID: {book.id}, Title: {book.title}, Author: {book.author}, Year: {book.year}")
EJEMPLO 2:
Celda 1: Instalación de SQLAlchemy
!pip install SQLAlchemy
Celda 2: Importación de Librerías y Definición del Modelo con Relaciones
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="addresses")
Celda 3: Crear la Base de Datos, Tablas y Agregar Datos con Relaciones
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
user1 = User(name="John Doe", addresses=[Address(email="john.doe@email.com")])
user2 = User(name="Jane Smith", addresses=[Address(email="jane.smith@email.com")])
session.add_all([user1, user2])
session.commit()
Celda 4: Consultar e Imprimir Usuarios y Direcciones con Relaciones
users = session.query(User).all()
for user in users:
print(f"User ID: {user.id}, Name: {user.name}")
for address in user.addresses:
print(f" Address ID: {address.id}, Email: {address.email}")
EJEMPLO 3:
Celda 1: Instalación de SQLAlchemy
!pip install SQLAlchemy
Celda 2: Importación de Librerías y Definición del Modelo
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
# Definir la base de datos y el modelo
Base = declarative_base()
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
Celda 3: Crear la Base de Datos y la Tabla
# Crear la conexión a la base de datos (en memoria para este ejemplo)
engine = create_engine('sqlite:///:memory:')
# Crear la tabla en la base de datos
Base.metadata.create_all(engine)
# Crear una sesión
Session = sessionmaker(bind=engine)
session = Session()
Celda 4: Agregar Datos a la Tabla de Estudiantes
# Agregar datos a la tabla de estudiantes
students_data = [
{"name": "Alice", "age": 22},
{"name": "Bob", "age": 21},
{"name": "Charlie", "age": 23},
]
students = [Student(**student_data) for student_data in students_data]
session.add_all(students)
session.commit()
​
Celda 5: Consultar e Imprimir Estudiantes
# Consultar e imprimir todos los estudiantes
all_students = session.query(Student).all()
print("Todos los estudiantes:")
for student in all_students:
print(f"ID: {student.id}, Name: {student.name}, Age: {student.age}")
​
Celda 6: Consultar e Imprimir Estudiantes Menores de 23 años
# Consultar e imprimir estudiantes menores de 23 años
young_students = session.query(Student).filter(Student.age < 23).all()
print("\nEstudiantes menores de 23 años:")
for student in young_students:
print(f"ID: {student.id}, Name: {student.name}, Age: {student.age}")