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.