SQLAlchemyORM-オブジェクトの更新

この章では、テーブルを必要な値で変更または更新する方法を説明します。

オブジェクトの特定の属性のデータを変更するには、それに新しい値を割り当て、変更をコミットして変更を永続化する必要があります。

ID = 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: [email protected]

次に、以下のように新しい値を割り当てて、Addressフィールドを更新する必要があります-

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: [email protected]

次に、名前属性を変更し、以下のコードを使用して内容を表示します-

x.name = 'Ravi Shrivastava'
print ("Name: ", x.name, "Address:", x.address, "Email:", x.email)

上記のコードの出力は次のとおりです。

Name: Ravi Shrivastava Address: Station Road Nanded Email: [email protected]

変更が表示されていても、コミットされていません。を使用して、以前の永続的な位置を保持できますrollback() method 以下のコードで。

session.rollback()

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

最初のレコードのオリジナルコンテンツが表示されます。

一括更新の場合、Queryオブジェクトのupdate()メソッドを使用します。接頭辞「Mr.」を付けてみましょう。各行に名前を付けます(ID = 2を除く)。対応する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:更新の前にselectクエリを実行して、更新クエリと一致するオブジェクトを検索します。および評価:セッション内のオブジェクトの基準を評価します。

表の4行のうち3行には、名前の前に「Mr.」が付いています。ただし、変更はコミットされないため、SQLiteStudioのテーブルビューには反映されません。セッションをコミットしたときにのみ更新されます。