SQLAlchemy – Columnas de la tabla de mapeo

En este artículo, veremos cómo mapear columnas de tablas usando SQLAlchemy en Python.

Necesitará una base de datos (MySQL, PostgreSQL, SQLite, etc.) para trabajar. Como vamos a usar MySQL en esta publicación, también instalaremos un conector SQL para MySQL en Python. Sin embargo, ninguna de las implementaciones de código cambia con el cambio en la base de datos, excepto los conectores SQL.

pip install pymysql

Usaremos la base de datos sakila de muestra de MySQL. Todos los ejemplos cubiertos en este artículo harán uso de la tabla actor dentro de la base de datos sakila. Si no tiene la base de datos sakila y desea seguir este artículo sin instalarlo, use el script SQL presente en el enlace que se menciona a continuación para crear el esquema requerido y la tabla de actores junto con los registros.

Usado en la base de datos: Sakila Actor Table Script

Nos referiremos a la misma consulta SQL en cada uno de los ejemplos mencionados a continuación:

SELECT first_name FROM sakila.actor LIMIT 1;

Las diferentes formas en que podemos mapear las columnas en SQLAlchemy son:

  • Asignación de columnas directamente a los nombres de los atributos
  • Asignación de columnas de forma distinta a los nombres de los atributos
  • Mapeo de columnas usando la reflexión
  • Mapeo de columnas usando un prefijo

Asignación de columnas directamente a los nombres de los atributos

En el siguiente ejemplo, la asignación de columnas se realiza asignando cada una de las columnas de la tabla como atributos de clase. Cada uno de los atributos se proporciona con el mismo nombre que las columnas de la tabla correspondiente que representa. Luego establecemos el motor SQLAlchemy conectado a la base de datos sakila en MySQL. Luego se crea un objeto de sesión para consultar la base de datos. Usando este objeto de sesión, consultaremos el primer registro en la tabla `actor`. Obtenemos el valor de la columna `first_name` para el primer registro accediendo al atributo `first_name` del objeto `resultado`. Esto muestra que la columna de la tabla de actores se asigna a los atributos de la clase Actor.

Python3

import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
  
Base = declarative_base()
  
# MAPPING TABLE ACTOR
class Actor(Base):
  
    __tablename__ = 'actor'
  
    actor_id    = db.Column(db.SmallInteger, autoincrement=True, primary_key=True)
    first_name  = db.Column(db.String(45), nullable=False)
    last_name   = db.Column(db.String(45), nullable=False)
    last_update = db.Column(db.TIMESTAMP, nullable=False)
  
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
  
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
  
# SELECT * FROM sakila.actor LIMIT 1;
result = session.query(Actor).first()
  
# DISPLAY FIRST NAME OF FIRST RECORD IN ACTOR TABLE
print("First Name (Record 1):", result.first_name)

Producción:

First Name (Record 1): PENELOPE

Asignación de columnas de forma distinta a los nombres de los atributos

Esto es similar al primer ejemplo con un pequeño cambio. Los nombres de los atributos mencionados en este ejemplo son diferentes a los nombres de las columnas. Esto es posible proporcionando un parámetro adicional dentro del método `Column()`. El primer argumento del método toma el nombre real de la columna, lo que permite usar diferentes nombres de atributos para hacer referencia a estas columnas. Si observamos el método `print()` final, se hace referencia al primer nombre del primer registro en la tabla de actores usando el atributo `fname` en lugar del `first_name` o el nombre real de la columna que se ve en el primer ejemplo.

Python3

import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
  
Base = declarative_base()
  
# MAPPING TABLE ACTOR
class Actor(Base):
  
    __tablename__ = 'actor'
  
    id        = db.Column('actor_id', db.SmallInteger, autoincrement=True, 
                          primary_key=True)
    fname     = db.Column('first_name', db.String(45), nullable=False)
    lname     = db.Column('last_name', db.String(45), nullable=False)
    update_on = db.Column('last_update', db.TIMESTAMP, nullable=False)
  
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
  
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
  
# SELECT * FROM sakila.actor LIMIT 1;
result = session.query(Actor).first()
  
# DISPLAY FIRST NAME OF FIRST RECORD IN ACTOR TABLE
print("First Name (Record 1):", result.fname)

Producción:

First Name (Record 1): PENELOPE

Mapeo de columnas usando la reflexión

En los dos ejemplos anteriores, necesitábamos mapear explícitamente cada columna con la tabla usando la clase y sus atributos. En este método, no necesitamos proporcionar este mapeo explícito de cada columna de la tabla por separado. Mediante la reflexión, esta tarea se realiza automáticamente al proporcionar el objeto de metadatos y la conexión del motor SQLAlchemy. En el atributo `__table__`. Luego podemos usar el motor y los objetos de sesión para consultar la tabla de actores para obtener el primer nombre como se hizo en ejemplos anteriores usando el nombre de la columna `first_name` como el nombre del atributo en sí.

Python3

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")
  
class Actor(Base):
    __table__ = db.Table("actor", Base.metadata, autoload_with=engine)
  
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
  
# SELECT COUNT(*) FROM Table LIMIT 1;
result = session.query(Actor).first()
  
# DISPLAY FIRST NAME OF FIRST RECORD IN ACTOR TABLE
print("First Name (Record 1):", result.first_name)

Producción:

First Name (Record 1): PENELOPE

Mapeo de columnas usando un prefijo

El uso de prefijos es raro, pero aun así, se puede encontrar en algunos casos de uso. En este ejemplo, se puede ver que hemos usado un atributo adicional `__mapper_args__` que es un diccionario de python. Se proporciona con una clave como `column_prefix` y un valor de `_`. Esto significa que queremos prefijar todos los nombres de columnas o atributos con un guión bajo. Por esta razón, usamos `_first_name` en lugar de `first_name` como atributo para la columna respectiva.

Python3

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")
  
class Actor(Base):
    __table__ = db.Table("actor", Base.metadata, autoload_with=engine)
    __mapper_args__ = {'column_prefix': '_'}
  
# DEFINE THE ENGINE (CONNECTION OBJECT)
engine = db.create_engine("mysql+pymysql://root:password@localhost/sakila")
  
# CREATE A SESSION OBJECT TO INITIATE QUERY IN DATABASE
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
  
# SELECT COUNT(*) FROM Table LIMIT 1;
result = session.query(Actor).first()
  
# DISPLAY FIRST NAME OF FIRST RECORD IN ACTOR TABLE
print("First Name (Record 1):", result._first_name)

Producción:

First Name (Record 1): PENELOPE

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 *