在SQLAlchemy中自動選擇插入新物件或更新原有物件

Posted on 十二月 13th, 2009

有時在新增物件到資料庫的時候,因為不清楚資料庫中是否已經存在有相同Primary Key的物件,我們會這樣寫:
obj = obj()
obj = value
SELECT COUNT(*) AS count FROM table WHERE table.PK=obj.PK
if count > 0 then
UPDATE table SET table=obj WHERE table.PK=PK
else
INSERT INTO table (columns) VALUES (obj)
end if
以避免因為PK相同造成違反unique constraint。當然,Oracle本身提供merge的SQL指令,是一個例外。
SQLAlchemy作為ORM,本身提供了merge資料庫現有物件與新物件的功能。使用方式如下:
merged_obj = session.merge(existing_obj)
作用是可以將existing_obj這個object instance以及其相關子物件,與資料庫中的現有物件進行結合後,傳回與現有session完成關聯的物件。在後續程式中可將此物件寫入並反應到資料庫中。
Session.merge()會完成以下動作:

利用物件的Primary Key,由資料庫取出物件。
如果資料庫中不存在此物件,則建立一個新物件。
將傳入物件的狀態,複製到找到的物件或新建的物件中。
針對子物件進行相同動作。
傳回新物件。

因此同一段程式在SQLAlchemy中可以寫成:
obj = obj()
obj.field = value
obj = session.merge(obj)
session.add(obj)

Share and Enjoy:

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • NewsVine
  • Reddit
  • StumbleUpon
  • Google Bookmarks
  • Yahoo! Buzz
  • Twitter
  • Technorati
  • Live
  • LinkedIn
  • MySpace
  • Print
  • Add to favorites
  • Hemidemi