2011-03-14 77 views
0

在SQLAlchemy的查詢來查詢,您可以選擇特定的行這樣的:SQLAlchemy的增加不需要的列時,外鍵表添加

q = session.query(Equipment.name) 

,將返回一列的每一行。您可以從模型中添加更多的列描述符。在這種情況下,len(q.column_descriptions)的值就是1。

但是,只要添加一個外鍵列,即使我沒有要求他們,您也會突然收到表格的所有列。

q = dbsession.query(models.Equipment.name, models.Equipment.model) 

這應該是兩列,但現在len(q.column_descriptions)是15(此表,這就是所有的人都加addidtional一個)。

查詢(q.statement)結束這樣看:

SELECT public.equipment.name, public.equipment.id, public.equipment.model_id, public.equipment.serno, public.equipment.location_id, public.equipment.sublocation, public.equipment.addeddate, public.equipment.comments, public.equipment.language_id, public.equipment.owner_id, public.equipment.vendor_id, public.equipment.account_id, public.equipment.parent_id, public.equipment.active 
FROM public.equipment 

我認爲這是SQLAlchemy的一個bug,但也許我做錯了什麼,有人在這裏可能知道它是什麼。

回答

3

「name」是一列。 「模型」不是 - 它的關係()(基於上面觀察到的行爲)。關係的當前默認__clause_element__()是整個表格,所以這就是爲什麼所有列都被吐出來的原因。正如您在票#1328中注意到的那樣,這是相關的,但是提議存在您將返回('name',SomeModelObject),所以不是那裏的外鍵列。 「外鍵」和「關係」之間的區別在SQLAlchemy中是不同的,與其他ORM工具相比可能會隱藏「外鍵」列存在的事實。

要僅查詢FK列,您要查詢查詢(Equipment.name,Equipment.model_id)或任何引用「model」的外鍵列的名稱。如果您使用的是Elixir,那麼您可能需要深入瞭解他們的文檔以查看他們使用的名稱。

+0

感謝您的信息。所以這是「預期」的行爲,我猜。但是這很奇怪,因爲如果我包含整行's.query(Equipment)',我只是按預期得到該列的外鍵id。但是,然後嘗試只選擇該列,然後我得到整個行。這不是我所期望的。無論如何,似乎只有解決方法是以某種方式解決它(可能只是獲取整行並挑出客戶端代碼中的列)。 – Keith 2011-03-14 20:55:10

+0

你有什麼建議,我可以做這樣的查詢,只是作爲一個整數(外鍵ID)的列值? – Keith 2011-03-15 10:48:32

+0

@Keith如果你想要外鍵id爲什麼不請求它? 'q = dbsession.query(models.Equipment.name,models.Equipment.model_id)' – lambacck 2011-10-30 03:24:24