¿Cómo usar el operador IN en SQLAlchemy en Python?

En este artículo, veremos cómo usar el operador IN usando SQLAlchemy en Python.

Cubriremos 2 ejemplos, uno para las capas SQLAchemy Core y ORM. En ambos ejemplos, contaremos el número de registros presentes en la tabla de categorías dentro de la base de datos sakila . Los datos de muestra de la tabla se ven como.

Si no tiene la base de datos sakila y desea seguir este artículo sin instalarlo, utilice el siguiente script SQL para crear el esquema y la tabla de categorías necesarios junto con los registros.

CREATE DATABASE IF NOT EXISTS `sakila`;
USE `sakila`;

DROP TABLE IF EXISTS `category`;
CREATE TABLE `category` (
  `category_id` tinyint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`category_id`)
);

INSERT INTO `category`
VALUES 
  (1, 'Action', '2006-02-14 23:16:27'),
  (2, 'Animation', '2006-02-14 23:16:27'),
  (3, 'Children', '2006-02-14 23:16:27'),
  (4, 'Classics', '2006-02-14 23:16:27'),
  (5, 'Comedy', '2006-02-14 23:16:27'),
  (6, 'Documentary', '2006-02-14 23:16:27'),
  (7, 'Drama', '2006-02-14 23:16:27'),
  (8, 'Family', '2006-02-14 23:16:27'),
  (9, 'Foreign', '2006-02-14 23:16:27'),
  (10, 'Games', '2006-02-14 23:16:27'),
  (11, 'Horror', '2006-02-14 23:16:27'),
  (12, 'Music', '2006-02-14 23:16:27'),
  (13, 'New', '2006-02-14 23:16:27'),
  (14, 'Sci-Fi', '2006-02-14 23:16:27'),
  (15, 'Sports', '2006-02-14 23:16:27'),
  (16, 'Travel', '2006-02-14 23:16:27');

La consulta SQL que estamos viendo en los siguientes dos ejemplos es:

SELECCIONE category_id, nombre DE categoría DONDE nombre EN («Acción», «Horror», «Ciencia ficción»);

Núcleo de SQLAlchemy

En el ejemplo anterior y con referencia a la tabla de categorías creada anteriormente, hemos filtrado los registros que tienen ‘Acción’, ‘Horror’ o ‘Ciencia ficción’ en el campo de nombre. Estamos seleccionando la columna category_id y name de la tabla de categorías. Como podemos ver, el ejemplo corresponde a SQLAlchemy Core, hemos utilizado el objeto de metadatos para obtener la información de metadatos sobre la tabla. Ahora, veamos cómo podemos hacer lo mismo usando SQLAlchemy ORM.

Python

# IMPORT THE REQUIRED LIBRARY
import sqlalchemy as db
 
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://\
root:password@localhost/sakila")
 
# CREATE THE METADATA OBJECT TO ACCESS THE TABLE
meta_data = db.MetaData(bind=engine)
db.MetaData.reflect(meta_data)
 
# GET THE `category` TABLE FROM THE METADATA OBJECT
category_table = meta_data.tables['category']
 
# SELECT category_id, name FROM category
# WHERE name IN ("Action", "Horror",  "Sci-Fi");
query = db.select([
    category_table.c.category_id,
    category_table.c.name
]).where(
    category_table.c.name.in_([
        "Action", "Horror",  "Sci-Fi"
    ])
)
 
# FETCH ALL THE RECORDS IN THE RESPONSE
result = engine.execute(query).fetchall()
 
# VIEW THE ENTRIES IN THE RESULT
for record in result:
    print("\n", record)

Producción:

Ejemplo básico de SQAlchemy

SQLAchemy ORM

Los resultados del ejemplo ORM son los mismos que los resultados obtenidos para el ejemplo Core. La diferencia entre los dos es la sintaxis. Para el ORM, necesitamos definir el modelo de tabla. En el código anterior, hemos creado la clase Categoría que también define los diferentes campos o columnas presentes en la tabla. Usamos esta clase para consultar la base de datos. Debido al uso de modelos de clase, ORM se siente más pythonico en SQLAlchemy. Sin embargo, se prefiere cuando se supone que su programa debe definir el esquema y la arquitectura de la base de datos; de lo contrario, Core puede resultar muy útil.

Python

# IMPORT REQUIRED LIBRARIES
from sqlalchemy.orm import sessionmaker
import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
 
Base = declarative_base()
 
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://\
root:password@localhost/sakila")
 
# CREATE THE TABLE MODEL TO USE IT FOR QUERYING
class Category(Base):
 
    __tablename__ = 'category'
 
    category_id = db.Column(
        db.SmallInteger, primary_key=True,
      autoincrement=True)
    name = db.Column(db.String(25))
    last_update = db.Column(db.DateTime)
 
 
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
Session = sessionmaker(bind=engine)
session = Session()
 
# SELECT category_id, name FROM
# category WHERE name IN
# ("Action", "Horror",  "Sci-Fi");
result = session.query(Category.category_id, Category.name) \
    .filter(
        Category.name.in_(("Action", "Horror",  "Sci-Fi"))
)
 
# VIEW THE ENTRIES IN THE RESULT
for record in result:
    print("\n", record.category_id, "-", record.name)

Producción:

Ejemplo de SQLAlchemy ORM

Publicación traducida automáticamente

Artículo escrito por apathak092 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *