Este video tutorial veremos cómo hacer un mapeo de los modelos con la base de datos utilizando el ORM de SQLAlchemy. El ORM de SQLAlchemy presenta un método para asociar las clases de Python definidas por el usuario con las tablas de la base de datos; y las instancias de esas clases, es decir, los objetos, con las filas en su tabla correspondiente. Además, el ORM incluye un sistema que sincroniza, de forma transparente para el usuario, todos los cambios de estado entre los objetos y sus correspondientes filas, llamado "unit of work", así como un sistema para expresar consultas a la base de datos en términos de las clases definidas por el usuario, y las relaciones entre cada una. Cuando se utiliza el ORM, el proceso de configuración comienza por describir las tablas de la base de datos que vamos a utilizar y, luego, definir nuestras propias clases que serán mapeadas a esas tablas. Sin embargo, en las nuevas versiones de SQLAlchemy, estas dos tareas se realizan generalmente juntas, utilizando un sistema conocido como "sistema declarativo" que nos permite crear clases que incluyen directivas para describir la tabla actual de la base de datos que será mapeada. Las clases mapeadas, utilizando el sistema declarativo, son definidas en términos de una clase que mantiene un catálogo de clases y tablas relativas a esta base. Esto es conocido como la "clase base declarativa". Nuestra aplicación, generalmente, tendrá sólo una instancia de esta base en un módulo común, importado. Creamos la clase base utilizando la función "declarative base". Ahora que tenemos una base, podemos definir las clases mapeadas a la base de datos en torno a ésta. Veamos un ejemplo. Vamos a crear el modelo "Author". Como vemos, dentro de la clase se definen el nombre de la tabla y los tipos de datos de las columnas. Para crear un mapeo de modelo, como mínimo hay que definir el nombre de la tabla y, al menos, una columna que sea "primary key". Cuando nuestra clase es construida, el sistema declarativo reemplaza todos los objetos de tipo "Column" por un atributo especial conocido como "descriptor". Este es un proceso conocido como "instrumentación". La clase mapeada nos proveerá de los medios para referir a nuestra tabla en un contexto de SQL, así como también persistir o cargar valores de las columnas desde la base de datos. Fuera del proceso de mapeo, la clase sigue siendo, en su mayoría, una clase normal de Python donde podemos definir los atributos y métodos que necesitemos para nuestra aplicación. Antes de hacer una prueba en la terminal, veamos dos cuestiones más. Una es la columna "ID", que es de tipo entero, que se le define en una secuencia. Esta secuencia se crea en la base de datos y, en general, es un número incremental que la base de datos va asignando. Entonces, este campo "ID" no se completa, sino que se suele llenar con la base de datos directamente. Otra cuestión es que al modelo de la base declarativa, con el "metadata" le podemos llamar el método "create_all" y le pasamos un motor de base de datos, en este caso es SQLite en memoria, y se van a crear todas las tablas que no se hayan creado todavía en la base de datos. Como la base de datos es de memoria, empieza vacía y se va a crear, en este caso, la tabla "author". Ahora, veamos un ejemplo en la terminal. Para eso, vamos a importar el módulo, con un asterisco todo el contenido. Y vamos a llamar primero a la clase "Author", le vamos a pedir su tabla. Vemos que nos muestra la tabla con el nombre y, después, las diferentes columnas indicando si es "primary key" o no y el tipo, etcétera. Después, vemos que creamos un autor, entonces, le vamos a pedir al autor su nombre y nos devuelve el nombre. Y le vamos a pedir su apellido, nos devuelve el apellido. Si le pido el ID, no nos devuelve nada, es nulo, porque todavía no se guardó en la base de datos y todavía no se le asignó el número de secuencia en el campo "ID". Hemos visto cómo mapear modelos con la base de datos utilizando el ORM de SQLAlchemy.