Sqlalchemy 简明教程

SQLAlchemy ORM - Updating Objects

在本章中,我们将了解如何使用所需的值修改或更新表。

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

让我们从主键标识符为 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

现在我们需要通过分配新的值(如下所示)来更新地址字段 -

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

更改将持久地反映在数据库中。现在,我们通过如下使用 first() method 来获取表中第一行的相应对象:

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

现在,更改名称属性,并使用下面的代码显示内容:

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() method 来保留早期的持久位置。

session.rollback()

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

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

对于批量更新,我们要使用查询对象的 update() 方法。让我们尝试并给每一行(ID = 2 除外)的名称加上前缀“Mr.”。相应的 update() 语句如下:

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

The update() method requires two parameters as follows −

  1. 键的值词典,其中键是要更新的属性,值是属性的新内容。

  2. synchronize_session 属性,它提到了在会话中更新属性的策略。有效值为:false(表示不同步会话)、fetch(在更新之前执行选择查询,以查找与更新查询匹配的对象)和 evaluate(在会话中评估对象上的条件)。

表中四行中的三行名前会加上前缀“Mr.”。但是,不会提交更改,因此也不会反映在 SQLiteStudio 的表视图中。只有在提交会话时才会刷新。