6

Yabancı bir anahtar olan bir alan tarafından filtrelenmiş bir sınıfın örneklerini almaya çalışıyorum ancak bunu yapmaya çalıştığımda her zaman veritabanındaki tüm girdileri alıyorum. kritere uyanlar.SqlAlchemy - Bir ForeignKey olarak tanımlanan alana göre filtreleme

Diyelim ki basit bir ilişkide deklarasyon üssü kullanarak birkaç tane dersim var N: 1. "ContainerClass" biri örneğine ait olabilir

#!/usr/bin/python2.6 
class ContainerClass(declarativeBase): 
    __tablename__ = "container_classes" 
    _id = Column("id", Integer, primary_key=True) 
    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 


class WhateverClass(declarativeBase): 
    __tablename__ = "whatever_classes" 

    _id = Column("id", Integer, primary_key=True) 
    _total = Column("total", Integer) 
    _containerClassId = Column("container_class_id", Integer, ForeignKey("other_classes.id")) 

    _containerClass = relationship("ContainerClass", uselist=False) 

    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 
    total = sqlalchemy.orm.synonym('_total', descriptor=property(getTotal, setTotal)) 
    containerClassId = sqlalchemy.orm.synonym('_containerClassId', decriptor=property(getContainerClassId, setContainerClassId)) 
    containerClass = sqlalchemy.orm.synonym('_containerClass', descriptor=property(getContainerClass setContainerClass)) 

"WhateverClass" Bir örneğini (ve her ContainerClass WhateverClass birkaç örneği bulunabilir): Ben böyle modellenmislerdir. İlişki iyi çalışıyor gibi görünüyor. Bir "ContainerClass" için yeni bir "WhateverClass" eklerseniz, whateverClass.containerClassId düzgün bir şekilde kendisine ait olduğu ContainerClass değerini alır.

Ancak, diyelim ki == 5 olan "ContainerClass" a ait "WhateverClass" örneklerinin bir listesini almam gerekiyor.

yapmam denerseniz:

from myClasses import WhateverClass 
session.query(WhateverClass.WhateverClass).filter(WhateverClass.WhateverClass.containerClass.id == 5).all() 

ben veritabanında saklanır WhateverClass tüm örneklerini, id == ile ContainerClass bağlıdır yalnızca biz almak 5

Ancak, session.query (WhateverClass.WhateverClass) .filter (toplam < = 100) .all() yaparsam, "toplam" alanı < = 100 olan WhateverClass örneklerini düzgün şekilde alırım.

Ben sqlalchemy için oldukça yeni biriyim ... Katılmış bir sorgu veya bunun gibi bir şey kullanmak zorunda mıyım? Karmaşık olamayacağını biliyorum, ancak uygun bir çözüm bulamadım. Katıldım, sendikaları birleştirdim ... Ama (açıkçası) yanlış bir şey yapıyorum.

Ben sqlalchemy 0.6.6 ve Python 2.6 kullanıyorum

şimdiden teşekkürler (her ihtimale karşı alakalı olduğunu)!

cevap

10

basit bir sorgu için, sadece doğrudan sorgu:

session.query(WhateverClass).join(ContainerClass).filter(ContainerClass.id == 5).all() 
+0

O solüsyonu ile garip bir davranış olsun:

session.query(WhateverClass).filter(WhateverClass._containerClassId == 5).all() 

daha karmaşık ilişkiler, bir katılmak gerekir. Ben hala veritabanında sahip olduğum tüm "WhateverClass" örneklerini alıyorum, ancak ne olursa olsun, ne olursa olsun, ne olursa olsun "5" diyor. Ama bu doğru değil ... WhateverClass (lar) dan sadece bir tanesi containerClassId == 5 (300'ü 3'ü gibi) 300 örneğini alıyorum ve çıktıya göre 300'ün her ne olursa olsun .containerClassId == 5 ... ama MySQL sorgu tarayıcısının söylediği şey bu değil. Yine de yardımın için teşekkürler. – BorrajaX

+1

Güncelleme: Ben aptalım ... Aptal, aptal, aptal ... Veritabanımdaki tüm kayıtları yattım ve çıktığında daha fazla WidingClass'la kapıldım. ! Gecko'dan çalışıyordu! Tekrar teşekkürler... – BorrajaX