2010-02-01 34 views
2

SQLAlchemy ORM tutorial中,它大致描述了創建對象關係的過程如下。讓我們假裝我有一個表文章,一個表關鍵字和一個表創建一個多關係的Articles_Keywords。SQLAlchemy ORM插入相關對象但不選擇它們

article = meta.Session.query(Article).filter(id=1).one() 
keyword1 = meta.Session.query(Keyword).filter(id=1).one() 
keyword2 = meta.Session.query(Keyword).filter(id=2).one() 
article.keywords = [keyword1,keyword2] 
meta.Session.commit() 

我已經有問題的關鍵字,主鍵ID號,所以我需要做的就是這些ID添加到Articles_Keywords表,鏈接到這篇文章。問題是,爲了用ORM做到這一點,我必須從數據庫中選擇所有的關鍵字,這看起來沒有任何理由會增加很多開銷。

有沒有辦法創建這種關係而不運行任何SQL來選擇關鍵字?

回答

3

不幸的是,ORM無法在不查詢數據庫的情況下保持對象狀態的正常。但是,您可以輕鬆地繞過ORM並插入關聯表。假設Articles_Keywords是Table對象:

meta.Session.execute(Articles_Keywords.delete(Articles_Keywords.c.article_id == 1)) 
meta.Session.execute(Articles_Keywords.insert(), [ 
    {'article_id': 1, 'keyword_id': 1}, 
    {'article_id': 1, 'keyword_id': 2}, 
]) 

如果你去周圍的ORM則已經加載的集合都不會被更新,以反映數據庫的變化。如果您需要刷新集合調用Session.expire就可以了。這將導致集合在下次訪問時重新加載。

meta.Session.expire(article, ['keywords']) 
1

螞蟻有正確的答案,但如果你還映射article_keywords明確的關聯對象,你只想創建新ArticleKeyword對象和直添加。

+0

有沒有辦法通過這樣做ORM五年後?現在就開始吧。 – ovatsug25 2015-07-02 16:59:11

+0

這個答案*是*通過ORM。映射輔助表,使用您想要的兩個ID創建一個輔助表。 – zzzeek 2015-07-02 20:59:26