2011-03-14 6 views
0

に追加されたとき、あなたはこのような特定の行を選択することができます照会し、不要な列を追加します。モデルから列記述子を追加できます。この場合、len(q.column_descriptions)という値が1です。SQLAlchemyのは、外部キーテーブルはSQLAlchemyのクエリで

しかし、外来キーである列を追加するとすぐに、私はそれらを求めなかったとしても、テーブルのすべての列を突然取得します。

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

これは、2つの列でなければなりませんが、今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のバグであると思うが、多分私はそれが何であるかを知っているかもしれません、ここで何か間違っ誰かがやっています。

答えて

3

"name"は列です。 「モデル」はそうではありません - その関係()(上記の観察された行動に基づく)関係の現在のデフォルト__clause_element__()は完全なテーブルなので、すべての列が吐き出されるのはそのためです。チケット#1328に記載されているように、これは関連していますが、プロポーザルに戻ると( '名前'、SomeModelObject)、そこには外部キー列もありません。 「外部キー」列が存在するという事実を隠すかもしれない他のORMツールとは異なり、「外部キー」と「関係」との違いはSQLAlchemyでは異なります。

FK列のみを照会するには、query(Equipment.name、Equipment.model_id)、または「model」を参照する外部キー列の名前が何であるかを指定します。 Elixirを使用している場合は、彼らが使用している名前を確認するためにドキュメントを掘り下げなければならないかもしれません。

+0

ありがとうございました。だから、それは "期待された"振る舞いです。しかし、完全な行 's.query(Equipment)'をインクルードすると、期待通りにその列の外部キーIDを取得するだけなので、奇妙です。しかし、その列だけを選択しようとすると、とにかく行全体が得られます。それは私が期待するものではありません。とにかく、それは何らかの方法で(おそらくちょうど全体の行をフェッチし、クライアントコードの列を選ぶ)それを回避することが解決策であるようです。 – Keith

+0

私はこのようなクエリをどのようにして、整数(外部キーID)として列の値を取得することができるか提案はありますか? – Keith

+0

@Keith外部キーIDを要求する理由は何ですか? 'q = dbsession.query(models.Equipment.name、models.Equipment.model_id)' – lambacck