SQLAlchemy ORM - Atualizando objetos

Neste capítulo, veremos como modificar ou atualizar a tabela com os valores desejados.

Para modificar os dados de um determinado atributo de qualquer objeto, temos que atribuir um novo valor a ele e confirmar as alterações para tornar a alteração persistente.

Vamos buscar um objeto da tabela cujo identificador de chave primária, em nossa tabela Clientes com ID = 2. Podemos usar o método get () de sessão da seguinte forma -

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

Podemos exibir o conteúdo do objeto selecionado com o código fornecido abaixo -

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

De nossa tabela de clientes, a seguinte saída deve ser exibida -

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

Agora precisamos atualizar o campo Endereço atribuindo um novo valor conforme fornecido abaixo -

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

A mudança será refletida persistentemente no banco de dados. Agora vamos buscar o objeto correspondente à primeira linha da tabela usandofirst() method como segue -

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

Isso executará a seguinte expressão 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 ?

Os parâmetros limitados serão LIMIT = 1 e OFFSET = 0 respectivamente, o que significa que a primeira linha será selecionada.

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

Agora, a saída para o código acima exibindo a primeira linha é a seguinte -

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

Agora altere o atributo de nome e exiba o conteúdo usando o código abaixo -

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

A saída do código acima é -

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

Mesmo que a alteração seja exibida, ela não foi confirmada. Você pode manter a posição persistente anterior usandorollback() method com o código abaixo.

session.rollback()

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

O conteúdo original do primeiro registro será exibido.

Para atualizações em massa, devemos usar o método update () do objeto Query. Vamos tentar dar um prefixo, 'Sr.' para nomear em cada linha (exceto ID = 2). A instrução update () correspondente é a seguinte -

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

The update() method requires two parameters as follows −

  • Um dicionário de valores-chave com a chave sendo o atributo a ser atualizado e o valor sendo o novo conteúdo do atributo.

  • O atributo synchronize_session menciona a estratégia de atualização dos atributos na sessão. Os valores válidos são falsos: para não sincronizar a sessão, fetch: executa uma consulta de seleção antes da atualização para encontrar objetos que são correspondidos pela consulta de atualização; e avaliar: avaliar critérios em objetos na sessão.

Três das 4 linhas da tabela terão o nome prefixado com 'Sr.' No entanto, as alterações não são confirmadas e, portanto, não serão refletidas na visualização de tabela do SQLiteStudio. Ele será atualizado apenas quando confirmarmos a sessão.