SQLAlchemy ORM: declaración de mapeo
El objetivo principal de la API Object Relational Mapper de SQLAlchemy es facilitar la asociación de clases de Python definidas por el usuario con tablas de bases de datos, y objetos de esas clases con filas en sus tablas correspondientes. Los cambios en los estados de los objetos y las filas se emparejan de forma sincronizada entre sí. SQLAlchemy permite expresar consultas de base de datos en términos de clases definidas por el usuario y sus relaciones definidas.
El ORM se construye sobre el lenguaje de expresión SQL. Es un patrón de uso de alto nivel y abstracto. De hecho, ORM es un uso aplicado del lenguaje de expresión.
Aunque una aplicación exitosa se puede construir utilizando el Object Relational Mapper exclusivamente, a veces una aplicación construida con el ORM puede usar el Lenguaje de Expresión directamente donde se requieren interacciones específicas con la base de datos.
Declarar mapeo
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 otro es un parámetro de eco cuando se establece en True generará el registro de actividad. Si no existe, se creará la base de datos. En el siguiente ejemplo, se 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 emitir SQLORM que no usa el motor directamente; en cambio, el ORM lo utiliza entre bastidores.
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. En SQLAlchemy, estas dos tareas se realizan juntas. Esto se hace mediante el sistema declarativo; las clases creadas incluyen directivas para describir la tabla de base de datos real a la que están asignadas.
Una clase base almacena un catálogo de clases y tablas mapeadas en el sistema declarativo. Esto se llama clase base declarativa. Por lo general, solo habrá una instancia de esta base en un módulo comúnmente importado. La función declarative_base () se usa para crear una clase base. Esta función está definida en el módulo declarativo sqlalchemy.ext.
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
Una vez que se declara la clase base, se puede definir cualquier número de clases mapeadas en términos de ella. El siguiente código define la clase de un cliente. Contiene la tabla a la que se asignará y los nombres y tipos de datos de las columnas que contiene.
class Customers(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key = True)
name = Column(String)
address = Column(String)
email = Column(String)
Una clase en Declarativo debe tener un __tablename__ atributo, y al menos uno Columnque es parte de una clave primaria. Declarativo reemplaza todos losColumn objetos con accesos especiales de Python conocidos como descriptors. Este proceso se conoce como instrumentación, que proporciona los medios para hacer referencia a la tabla en un contexto SQL y permite conservar y cargar los valores de las columnas de la base de datos.
Esta clase mapeada como una clase Python normal tiene atributos y métodos según el requisito.
La información sobre la clase en el sistema declarativo se denomina metadatos de tabla. SQLAlchemy usa el 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 construcción de un objeto Mapper. Este objeto mapeador no se usa directamente, pero se usa internamente como 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 está disponible usando el .metadataatributo de clase base declarativa. losMetaData.create_all()es pasar nuestro motor como fuente de conectividad de base de datos. Para todas las tablas que aún no se han creado, emite instrucciones CREATE TABLE a la base de datos.
Base.metadata.create_all(engine)
El script completo para crear una base de datos y una tabla, y para mapear la clase Python se da 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 la ejecución de la expresión SQL:
CREATE TABLE customers (
id INTEGER NOT NULL,
name VARCHAR,
address VARCHAR,
email VARCHAR,
PRIMARY KEY (id)
)
Si abrimos Sales.db usando la herramienta gráfica SQLiteStudio, muestra la tabla de clientes en su interior con la estructura mencionada anteriormente.