2012-10-30 62 views
0

這是一個新手問題。我是ORM的新手,我想知道以下是否可能:SQLAlchemy基於相關對象的ORM插入

假設我有一個「用戶」表,其中包含三個字段:「id」,「user_name」和外鍵「country_id」分表「的國家」

Tables Relation

現在,如果我要插入一個新的用戶,我首先要看該國的「國家」表(例如11)的ID,然後創建用戶實例(聲明性基礎對象)

new_user = User('Johnny', 11) 
session.add(new_user) 

Wha T I想知道,如果是可以直接添加新用戶,只透過國家的名字......這樣的事情:

new_user = User('Johnny', Country('Spain')) # Note the country instance 
session.add(new_user) 

我想這樣的事情,但我得到了最好的結果是ORM試圖插入另一個名爲西班牙的國家。

在此先感謝!

+0

你用什麼工具來生成圖? – Pakman

+2

嗨,我用wwwsqldesigner。 – bgusach

回答

4

假設Spain已在數據庫中插入,則需要以下內容:

new_user = User(name='Johnny', country_id=session.query(Country).filter_by(name='Spain').one().id) 

這更清晰的版本是:

country = session.query(Country).filter_by(name='Spain').one() 
new_user = User(name='Johnny', country_id=country.id) 

如果你有一個User.countryrelationship定義這可以簡單地爲:

​​

如果User.country關係具有已定義的usersbackref關係(這將被默認映射到list),你也可以這樣做:

country = session.query(Country).filter_by(name='Spain').one() 
country.users.add(User(name='Johnny')) 
+0

這就是我正在做的。但仍然有這樣的感覺,那就是「過於人工」,也許可能有一種更清晰的方式來獲得它。 非常感謝! – bgusach

+0

當我嘗試做'country = session.query(Country).filter_by(name ='Spain') new_user = User(name ='Johnny',country = country)',我收到一個''Query'對象沒有屬性'_sa_instance_state'「。它只適用於如果我做country.first(),但會創建兩個SQL查詢(select,insert)。 – Pakman

+0

感謝您指出缺少'.one()'或'.first()'方法調用來實際檢索實例@Pakman。關於你提出的另一點,無論你事先已經知道國家ID,並使用它來插入用戶而不先查詢數據庫,或者如果你只知道名稱,我沒有看到任何方法首先查詢數據庫中的國家/地區名稱。 –