2013-12-19 20 views
1

我使用SQLAlchemy的訪問PostgreSQL數據庫,我這樣定義對象:SQLAlchemy的更新PostgreSQL的數組歸併不行

class SessionLog(Base): 
    __tablename__ = 'session_log' 

    id = Column(Integer, primary_key=True) 
    recordFile = Column('record_file', String(128)) 
    appSrcPorts = Column('app_src_ports', ARRAY(Integer)) 
    info5 = Column('info5', String(100)) 

,我選擇和更新session_log表是這樣的:

session = Session() 
sessionLog = session.query(SessionLog).filter_by(id=sessionLogId).first() 
sessionLog.appSrcPorts.append(1) 
session.merge(sessionLog) 
session.commit() 

但是我調用merge()和commit()後,'app_src_ports'列沒有更新,這很奇怪。 我找到一個醜陋的方式,使其工作,追加()前行,補充一點:

sessionLog.appSrcPorts = list(sessionLog.appSrcPorts) 

任何人都可以告訴我爲什麼?

+0

你的解決方案(sessionLog.appSrcPorts = list(sessionLog.appSrcPorts)使它成爲一個表單,作爲一種魅力:) –

回答

2

SQLAlchemy ORM依賴於事件的檢測,以便知道某些數據何時發生了更改,以及何時需要刷新數據。在這種情況下,您正在就地更改Python數組值,這不會默認生成任何事件。爲了使其工作,您需要將mutable extension與ARRAY類型(以及發送這些事件的list子類)結合使用,以便將更改作爲與父對象相關的事件發送。

+0

你認爲這是一個SQLAlchemy的bug嗎? – leeyiw

+0

嗯,我們應該有一個「MutableList」實現準備好進入sqlalchemy.ext.mutable,我們現在不需要(只有MutableDict)。而且,ORM可以引入一個系統,通過這個系統,類型可以宣傳他們的「可變」版本,從而減少了樣板的數量,以便爲像ARRAY這樣的標準案例使用Mutable類型。但是這些都是增強功能,我們不稱之爲這些錯誤。 – zzzeek

+0

我明白了,再次感謝! – leeyiw