मैंने सीआरएम ऐप से स्क्लेल्चेमी के साथ एक बहुत ही गंदा स्कीमा का आत्मनिरीक्षण किया है। सभी तालिकाओं पर उनके द्वारा एक हटाए गए कॉलम हैं और मैं उन सभी इकाइयों को फ़िल्टर करना चाहता हूं और हटाए गए संबंधों को ध्वजांकित किया गया है।स्वत: फ़िल्टर 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 तर्क के रूप में उपयोग कर सकते हैं - हालांकि ...
- वहाँ यह करने के लिए एक बेहतर तरीका है, मैं एक compicated वर्ग के आंतरिक भागों के साथ चारों ओर poking के साथ वास्तव में खुश नहीं हूँ जैसे प्रश्न मैं हूं।
- क्या किसी ने इसे अलग तरीके से हल किया है जिसे वे साझा कर सकते हैं?
बहुत अच्छा, मुझे इसके बारे में पता नहीं था! –
मैंने अभी यह करने की कोशिश की (एक अलग मेज पर) और यह काम नहीं किया। मुझे मिला: टाइपरर: 'टेबल' ऑब्जेक्ट इज़ेबल नहीं है कोई विचार क्यों? –
मेरा बुरा, चयन करने वाला पहला पैरामीटर ऑब्जेक्ट्स जैसे कॉलम/टेबल की एक सूची है, इसलिए email_join एक सूची में होना चाहिए। मैं इसे ठीक कर दूंगा। –