SQLAlchemy ORM - 更新对象



本章我们将学习如何修改或更新表中所需的值。

要修改任何对象的某个属性的数据,我们必须为其分配新值并提交更改以使更改持久化。

让我们从主键标识符为 2 的 Customers 表中提取一个对象。我们可以使用会话的 get() 方法,如下所示:

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

我们可以使用以下代码显示所选对象的内容:

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

从我们的客户表中,应该显示以下输出:

Name: Komal Pande Address: Koti, Hyderabad Email: komal@gmail.com

现在我们需要更新 Address 字段,并分配如下所示的新值:

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

更改将持久地反映在数据库中。现在我们使用**first() 方法**获取表中第一行的对应对象,如下所示:

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

这将执行以下 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 ?

绑定参数分别为 LIMIT = 1 和 OFFSET = 0,这意味着将选择第一行。

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

现在,以上代码显示第一行的输出如下:

Name: Ravi Kumar Address: Station Road Nanded Email: ravi@gmail.com

现在更改 name 属性并使用以下代码显示内容:

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

以上代码的输出为:

Name: Ravi Shrivastava Address: Station Road Nanded Email: ravi@gmail.com

即使显示了更改,它也没有提交。您可以使用以下代码中的**rollback() 方法**保留之前的持久位置。

session.rollback()

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

将显示第一条记录的原始内容。

对于批量更新,我们将使用 Query 对象的 update() 方法。让我们尝试在每一行(ID != 2 除外)的 name 前添加前缀“Mr.”。相应的 update() 语句如下:

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

update() 方法需要两个参数,如下所示:

  • 一个键值对字典,键是要更新的属性,值是属性的新内容。

  • synchronize_session 属性,用于说明更新会话中属性的策略。有效值为 false:不同步会话;fetch:在更新前执行 select 查询以查找与更新查询匹配的对象;evaluate:对会话中的对象评估条件。

表中的四行中有三行将以“Mr.”为 name 前缀。但是,更改未提交,因此不会反映在 SQLiteStudio 的表视图中。只有在我们提交会话时才会刷新。

广告
© . All rights reserved.