SQLAlchemy ORM – Declaración de mapeo

El objetivo principal de la API de mapeador relacional de objetos de SQLAlchemy es facilitar la vinculación de clases de Python definidas por el usuario a tablas de bases de datos y objetos de esas clases a cadenas en las tablas correspondientes. Los cambios en los estados de los objetos y las cadenas se sincronizan entre sí. SQLAlchemy le permite expresar consultas de base de datos en términos de clases definidas por el usuario y sus relaciones definidas.

ORM se basa en el lenguaje de expresión SQL. Este es un patrón de uso abstracto de alto nivel. De hecho, ORM es un uso aplicado de un lenguaje de expresión.

Si bien una aplicación exitosa solo se puede construir usando un mapeador relacional de objetos, a veces una aplicación construida con un ORM puede usar directamente un lenguaje de expresión donde se requieren ciertas interacciones con la base de datos.

Declarar colación

En primer lugar, se llama a la función create_engine () para configurar un objeto de motor que se utiliza posteriormente para realizar operaciones SQL. La función tiene dos argumentos, uno es el nombre de la base de datos y el otro es el parámetro de eco; si se establece en True, se generará un registro de actividad. Si no existe, se creará la base de datos. El siguiente ejemplo crea una base de datos SQLite.

from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)

El motor establece una conexión DBAPI real a la base de datos cuando se llama a un método como Engine.execute () o Engine.connect (). Luego se usa para generar un SQLORM que no usa directamente el motor; en su lugar, es utilizado por el ORM detrás de escena.

En el caso de ORM, el proceso de configuración comienza describiendo las tablas de la base de datos y luego definiendo las clases que se asignarán a esas tablas. SQLAlchemy realiza estas dos tareas juntas. Esto se hace mediante un sistema declarativo; las clases generadas incluyen directivas para describir la tabla de base de datos real a la que se asignan.

La clase base almacena un catálogo de clases y tablas mapeadas en un sistema declarativo. Esto se llama clase base declarativa. Normalmente, un módulo normalmente importado tendrá solo una instancia de esta base. La función declarative_base () se usa para crear una clase base. Esta función se define en el módulo declarativo sqlalchemy.ext.

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

Una vez que se declara una clase base, se puede definir cualquier número de clases mapeadas en términos de la clase base. El siguiente código define la clase de cliente. Contiene la tabla para mapear, así como los nombres y tipos de datos de las columnas en ella.

class Customers(Base):
   __tablename__ = 'customers'
   
   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

La clase en el Declarativo debe tener __nombre de la tabla__ atributo y al menos uno Columna que forma parte de la clave principal. Declarativo reemplaza todo Columna objetos con accesos especiales de Python conocidos como descriptores… Este proceso se conoce como kit de herramientas, que proporciona un medio para acceder a una tabla en el contexto de SQL y le permite almacenar y cargar valores de columna desde la base de datos.

Esta clase mapeada, como una clase Python normal, tiene atributos y métodos según sea necesario.

La información de clase en un sistema declarativo se denomina metadatos de tabla. SQLAlchemy usa un objeto Table para representar esta información para una tabla específica creada por Declarative. El objeto Table se crea de acuerdo con las especificaciones y se asocia con la clase mediante la creación de un objeto Mapper. Este objeto de mapeo no se usa directamente, sino que se usa internamente como una interfaz entre la clase mapeada y la tabla.

Cada objeto Table es miembro de una colección más grande conocida como MetaData, y este objeto es accesible usando .metadatos un atributo de una clase base declarativa. EN MetaData.create_all () el método es pasar nuestro motor como la fuente de la conexión a la base de datos. Para todas las tablas que aún no se han creado, envía declaraciones CREATE TABLE a la base de datos.

Base.metadata.create_all(engine)

El script completo para crear la base de datos y la tabla y también para mapear la clase Python se proporciona a continuación:

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Customers(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key=True)

   name = Column(String)
   address = Column(String)
   email = Column(String)
Base.metadata.create_all(engine)

Cuando se ejecuta, la consola de Python se repetirá después de ejecutar la instrucción SQL:

CREATE TABLE customers (
   id INTEGER NOT NULL,
   name VARCHAR,
   address VARCHAR,
   email VARCHAR,
   PRIMARY KEY (id)
)

Si abrimos Sales.db con la herramienta gráfica SQLiteStudio, mostrará una tabla de clientes con la estructura antes mencionada en su interior.

Mesa de clientes

🚫