[MÚSICA] En este video tutorial, veremos cómo se guardan objetos en la base de datos con el ORM de SQLAlchemy. Una vez creado el esquema con el método create_all, estamos en condiciones de comunicarnos con la base de datos. La comunicación con la base de datos se hace a través de una sesión. Cuando iniciamos la aplicación, al mismo nivel de la sentencia create_engine definimos una clase, session, que nos servirá para crear sesiones. Cuando utilizamos la sesión por primera vez, se recupera una conexión de un pool de conexiones que mantiene el motor de la base de datos. Esta conexión la tendrá la sesion hasta que se haga un commit o se cierre la sesión. Para guardar un objeto en la base de datos, vamos a agregarlo a la sesión. En este punto, todavía no se insertó una fila en la base de datos. La sesión persistirá el objeto en la base tan pronto como lo necesite, utilizando un proceso conocido como flush. Por ejemplo, si consulto a la base por el objeto recién creado, primero se hará un flush e inmediatamente después se hace la consulta a la base de datos. En este caso, estamos haciendo una consulta por el autor con nombre Joanne y nos quedamos con el primer objeto. Esta consulta nos va a traer el objeto Author, correspondiente a Joanne Rowling. Pero además, veremos que es la misma instancia. Esto es así porque la sesión la reconoce en su mapa interno de objetos y por eso devuelve exactamente la misma instancia que acabamos de insertar. Vamos a ejecutar el módulo en la terminal importando todo. Y vemos que nos imprime true porque las dos instancias son iguales. También podemos agregar una lista de objetos a la base de datos. Por ejemplo, con session.add_all y le paso una lista de autores. Entonces, ejecuto esta línea. Y ahora, si vemos la sesión y le pedimos el atributo new, me devuelve un identity set, un conjunto, digamos, con los autores que todavía no fueron guardados en la base, pero están en la sesión. Además, si modificamos un objeto, por ejemplo, le cambia el nombre del autor, la sesión lo registra. Por ejemplo, vamos a hacer session.dirty y nos va a decir que nos devuelve el conjunto de los objetos que están modificados en la sesión pero todavía no guardados en la base de datos. Luego, haciendo un commit, utilizamos el método commit de la sesión. Enviamos todos los cambios a la base de datos y se harán los dos insert y el update correspondientes. Y como mencionamos, se devuelve la conexión al pool de conexiones. Una vez insertados los dos objetos en la base de datos, todos los identificadores y valores por defecto generados por la base de datos están disponibles en la instancia. Por ejemplo, podemos hacer author.id y vemos que tiene el ID 1, lo que antes estaba en nulo. Como la sesión trabaja dentro de una transacción, entonces podemos hacer rollback de todos los cambios no incluidos en un commit. Por ejemplo, si modificamos el nombre del autor nuevamente y creamos un nuevo autor y lo agregamos en la sesión. Vamos a hacer una consulta para ver que realmente lo haya agregado. Vemos que están los dos autores con el nombre de Joanne y Gabriel. Y ahora vamos a hacer un session.rollback. Entonces, lo primero que haremos es preguntar el nombre del autor. Y vemos que no se modificó con el nombre Joanne, sino que sigue con Joanne K. Y después vamos a ver si another_author está en la sesión. Y nos dice que no, porque los cambios se han revertido. Hemos visto cómo guardar objetos en la base de datos utilizando SQLAlchemy. [MÚSICA]