SQLAlchemy ORM - 更新对象


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

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

让我们从 Customers 表中 ID=2 的主键标识符表中获取一个对象。我们可以使用会话的 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()方法获取与表中第一行相对应的对象,如下所示 -

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() 方法和下面的代码来保留先前的持久位置。

session.rollback()

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

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

对于批量更新,我们将使用 Query 对象的 update() 方法。让我们尝试给出一个前缀,“先生” 在每行中命名(ID = 2 除外)。相应的 update() 语句如下 -

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

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

  • 键值字典,key为要更新的属性,value为属性的新内容。

  • Synchronize_session 属性提到了更新会话中属性的策略。有效值为 false:对于不同步会话,fetch:在更新之前执行 select 查询,查找与更新查询匹配的对象;和评估:评估会话中对象的标准。

表中四分之三的行的姓名将以“先生”为前缀 但是,更改并未提交,因此不会反映在 SQLiteStudio 的表视图中。仅当我们提交会话时它才会刷新。