SQLAlchemy ORM - Actualización de objetos

En este capítulo, veremos cómo modificar o actualizar la tabla con los valores deseados.

Para modificar los datos de un determinado atributo de cualquier objeto, tenemos que asignarle un nuevo valor y confirmar los cambios para que el cambio sea persistente.

Busquemos un objeto de la tabla cuyo identificador de clave principal, en nuestra tabla Clientes con ID = 2. Podemos usar el método de sesión get () de la siguiente manera:

x = session.query(Customers).get(2)

Podemos mostrar el contenido del objeto seleccionado con el siguiente código:

print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

De la tabla de nuestros clientes, se debe mostrar el siguiente resultado:

Name: Komal Pande Address: Koti, Hyderabad Email: [email protected]

Ahora necesitamos actualizar el campo Dirección asignando un nuevo valor como se indica a continuación:

x.address = 'Banjara Hills Secunderabad'
session.commit()

El cambio se reflejará de forma persistente en la base de datos. Ahora obtenemos el objeto correspondiente a la primera fila de la tabla usandofirst() method como sigue -

x = session.query(Customers).first()

Esto se ejecutará siguiendo la expresión SQL:

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
LIMIT ? OFFSET ?

Los parámetros enlazados serán LIMIT = 1 y OFFSET = 0 respectivamente, lo que significa que se seleccionará la primera fila.

print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

Ahora, la salida del código anterior que muestra la primera fila es la siguiente:

Name: Ravi Kumar Address: Station Road Nanded Email: [email protected]

Ahora cambie el atributo de nombre y muestre el contenido usando el siguiente código:

x.name = 'Ravi Shrivastava'
print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

La salida del código anterior es:

Name: Ravi Shrivastava Address: Station Road Nanded Email: [email protected]

Aunque se muestra el cambio, no se confirma. Puede retener la posición persistente anterior utilizandorollback() method con el código de abajo.

session.rollback()

print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

Se mostrará el contenido original del primer registro.

Para actualizaciones masivas, usaremos el método update () del objeto Query. Intentemos dar un prefijo, 'Sr.' nombrar en cada fila (excepto ID = 2). La instrucción update () correspondiente es la siguiente:

session.query(Customers).filter(Customers.id! = 2).
update({Customers.name:"Mr."+Customers.name}, synchronize_session = False)

The update() method requires two parameters as follows −

  • Un diccionario de valores-clave en el que la clave es el atributo a actualizar y el valor es el nuevo contenido del atributo.

  • Atributo synchronize_session que menciona la estrategia para actualizar atributos en la sesión. Los valores válidos son falsos: para no sincronizar la sesión, buscar: realiza una consulta de selección antes de la actualización para encontrar objetos que coincidan con la consulta de actualización; y evaluar: evaluar criterios sobre objetos en la sesión.

Tres de las 4 filas de la tabla tendrán el nombre con el prefijo 'Sr.' Sin embargo, los cambios no se confirman y, por lo tanto, no se reflejarán en la vista de tabla de SQLiteStudio. Se actualizará solo cuando confirmemos la sesión.