2009-05-28 16 views
6

मैंने सीआरएम ऐप से स्क्लेल्चेमी के साथ एक बहुत ही गंदा स्कीमा का आत्मनिरीक्षण किया है। सभी तालिकाओं पर उनके द्वारा एक हटाए गए कॉलम हैं और मैं उन सभी इकाइयों को फ़िल्टर करना चाहता हूं और हटाए गए संबंधों को ध्वजांकित किया गया है।स्वत: फ़िल्टर SQLAlchemy प्रश्नों का सही तरीका है?


class CustomizableQuery(Query): 
    """An overridden sqlalchemy.orm.query.Query to filter entities 

    Filters itself by BinaryExpressions 
    found in :attr:`CONDITIONS` 
    """ 

    CONDITIONS = [] 

    def __init__(self, mapper, session=None): 
     super(CustomizableQuery, self).__init__(mapper, session) 
     for cond in self.CONDITIONS: 
      self._add_criterion(cond) 

    def _add_criterion(self, criterion): 
     criterion = self._adapt_clause(criterion, False, True) 
     if self._criterion is not None: 
      self._criterion = self._criterion & criterion 
     else: 
      self._criterion = criterion 

और यह इस तरह किया जाता है::

class UndeletedContactQuery(CustomizableQuery): 
    CONDITIONS = [contacts.c.deleted != True] 

    def by_email(self, email_address): 
     return EmailInfo.query.by_module_and_address('Contacts', email_address).contact 

    def by_username(self, uname): 
     return self.filter_by(twod_username_c=uname).one() 

class Contact(object): 
    query = session.query_property(UndeletedContactQuery) 

Contact.query.by_email('[email protected]') 

EmailInfo वर्ग कि ईमेल और अन्य मॉड्यूल है कि वे कर रहे हैं के बीच तालिका में शामिल होने के लिए मैप किए है यहाँ मैं के साथ आया है से संबंधित।

यहाँ एक नक्शाकार का एक उदाहरण है:

contacts_map = mapper(Contact, join(contacts, contacts_cstm), { 
    '_emails': dynamic_loader(EmailInfo, 
           foreign_keys=[email_join.c.bean_id], 
           primaryjoin=contacts.c.id==email_join.c.bean_id, 
           query_class=EmailInfoQuery), 
    }) 

class EmailInfoQuery(CustomizableQuery): 

    CONDITIONS = [email_join.c.deleted != True] 
    # More methods here 

यह मैं देता है कि मैं क्या चाहता हूँ कि मैं सभी हटाए गए संपर्क फिल्टर करके निकाल दिए गए हैं। मैं अपने मानचित्रकारों में dynamic_loader को query_class तर्क के रूप में उपयोग कर सकते हैं - हालांकि ...

  1. वहाँ यह करने के लिए एक बेहतर तरीका है, मैं एक compicated वर्ग के आंतरिक भागों के साथ चारों ओर poking के साथ वास्तव में खुश नहीं हूँ जैसे प्रश्न मैं हूं।
  2. क्या किसी ने इसे अलग तरीके से हल किया है जिसे वे साझा कर सकते हैं?

उत्तर

7

आप एक चयन के लिए मानचित्र कर सकते हैं। इस तरह:

mapper(EmailInfo, select([email_join], email_join.c.deleted == False)) 
+0

बहुत अच्छा, मुझे इसके बारे में पता नहीं था! –

+0

मैंने अभी यह करने की कोशिश की (एक अलग मेज पर) और यह काम नहीं किया। मुझे मिला: टाइपरर: 'टेबल' ऑब्जेक्ट इज़ेबल नहीं है कोई विचार क्यों? –

+0

मेरा बुरा, चयन करने वाला पहला पैरामीटर ऑब्जेक्ट्स जैसे कॉलम/टेबल की एक सूची है, इसलिए email_join एक सूची में होना चाहिए। मैं इसे ठीक कर दूंगा। –

0

मैं अगर यह इन तालिकाओं कि को फ़िल्टर नष्ट कर दिया तत्वों के लिए दृश्य बनाने के लिए संभव हो गया था देखने पर विचार करना चाहते हैं, और उसके बाद आप अंतर्निहित तालिका के बजाय उस दृश्य के लिए सीधे मैप करने के लिए सक्षम हो सकता है, कम से कम पूछताछ के संचालन के लिए। हालांकि मैंने कभी यह कोशिश नहीं की है!

संबंधित मुद्दे