2010-09-01 12 views
8

कॉल करता है I sqlalchemy के लिए नया हूं और कुछ मदद का उपयोग कर सकता हूं। मैं एक छोटा सा एप्लीकेशन लिखने की कोशिश कर रहा हूं जिसके लिए मुझे एक चुनिंदा कथन को गतिशील रूप से बदलना है। तो मैं s = select([files]) करता हूं, और फिर मैं s = s.where(files.c.createtime.between(val1, val2)) द्वारा फ़िल्टर जोड़ता हूं। यह बहुत अच्छा काम करता है, लेकिन केवल एक और संयोजन के साथ। तो, जब मैं createtime (between 1.1.2009 and 1.2.2009) OR createtime == 5.2.2009 के साथ सभी प्रविष्टियां रखना चाहता हूं, तो मुझे समस्या मिली कि मुझे नहीं पता कि विभिन्न फ़िल्टर-कॉल के साथ इसे कैसे प्राप्त किया जाए। क्योंकि कार्यक्रमों तर्क का यह उपयोग करने के लिए s= s.where(_or(files.c.createtime.between(val1, val2), files.c.createtime == DateTime('2009-02-01')))स्क्लेल्चेमी: एकाधिक फ़िल्टर() - कॉल

अग्रिम धन्यवाद, Christof संभव नहीं है

उत्तर

26

आप सूची से गतिशील बनाने या खंड कर सकते हैं:

clauses = [] 
if cond1: 
    clauses.append(files.c.createtime.between(val1, val2)) 
if cond2: 
    clauses.append(files.c.createtime == DateTime('2009-02-01')) 
if clauses: 
    s = s.where(or_(*clauses)) 
+0

कोड – Dimitris

+0

code.Thanks का अच्छा टुकड़ा का सुंदर काम टुकड़ा :) – SRC

2

आप "धोखा" करने को तैयार हैं Select ऑब्जेक्ट्स पर अनियंत्रित _whereclause विशेषता का उपयोग करके, आप पिछली क्वेरी के आधार पर हर बार एक नई क्वेरी बनाकर या शर्तों की एक श्रृंखला निर्दिष्ट कर सकते हैं, जहां क्लॉज:

s = select([files]).where(literal(False)) # Start with an empty query. 
s = select(s.froms).where(or_(s._whereclause, 
     files.c.createtime.between(val1, val2))) 
s = select(s.froms).where(or_(s._whereclause, 
     files.c.createtime == datetime(2009, 2, 1))) 

एक संघ का निर्माण एक और विकल्प है। इसमें कुछ समय clunkier है, लेकिन गैर-दस्तावेजी विशेषताओं पर निर्भर नहीं करता:

s = select([files]).where(literal(False)) # Start with an empty query. 
s = s.select().union(
     select([files]).where(files.c.createtime.between(val1, val2))) 
s = s.select().union(
     select([files]).where(files.c.createtime == datetime(2009, 2, 1))) 
संबंधित मुद्दे