SQLAlchemy ORM - 更新对象
在本章中,我们将了解如何使用所需值修改或更新表。
要修改任何对象某个属性的数据,我们必须为其分配新值并提交更改以使更改持久。
让我们从表中获取一个对象,该对象的主键标识符在我们的 Customers 表中,ID=2。我们可以使用 session 的 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
现在更改名称属性并使用以下代码显示内容 −
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)
将显示第一条记录的原始内容。
对于批量更新,我们将使用查询对象的 update() 方法。让我们尝试在每行中为姓名添加前缀"Mr."(ID = 2 除外)。对应的update()语句如下 −
session.query(Customers).filter(Customers.id! = 2). update({Customers.name:"Mr."+Customers.name}, synchronize_session = False)
update()方法需要两个参数如下 −
一个键值字典,键为需要更新的属性,值是属性的新内容。
synchronize_session属性,用于指定在session中更新属性的策略,有效值为false:表示不同步session,fetch:表示在更新之前执行select查询,查找与更新查询匹配的对象;并评估:评估会话中对象的标准。
表中 4 行中有 3 行的名称前缀为"Mr"。但是,更改未提交,因此不会反映在 SQLiteStudio 的表视图中。只有当我们提交会话时,它才会刷新。