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 −
-
键的值词典,其中键是要更新的属性,值是属性的新内容。
-
synchronize_session 属性,它提到了在会话中更新属性的策略。有效值为:false(表示不同步会话)、fetch(在更新之前执行选择查询,以查找与更新查询匹配的对象)和 evaluate(在会话中评估对象上的条件)。
表中四行中的三行名前会加上前缀“Mr.”。但是,不会提交更改,因此也不会反映在 SQLiteStudio 的表视图中。只有在提交会话时才会刷新。