2012-02-01 14 views
6

मुझे स्क्लेक्लेमी कोर में एक साधारण SQL अद्यतन कथन होना चाहिए, यह लिखने में कठिनाइयों का सामना करना पड़ रहा है। हालांकि, मुझे कोई दस्तावेज, उदाहरण या ट्यूटोरियल नहीं मिल रहा है जो दिखाता है कि कई स्थितियों को कैसे जोड़ना है। मुझे यकीन है कि यह वहां है - बस इसे नहीं मिला।SQLAlchemy: कई स्थितियों के साथ एसक्यूएल अभिव्यक्ति

self.struct = Table('struct', 
        metadata, 
        Column('schema_name',   String(40), nullable=False, 
                   primary_key=True), 
        Column('struct_name',   String(40), nullable=False, 
                   primary_key=True), 
        Column('field_type',   String(10), nullable=True), 
        Column('field_len',   Integer,  nullable=True)) 

यहाँ डालने & अद्यतन बयान है::

यहाँ तालिका है

def struct_put(self, **kv): 
    try: 
     i = self.struct.insert() 
     result = i.execute(**kv) 
    except exc.IntegrityError: # row already exists - update it: 
     u = self.struct.update().\ 
      where((self.struct.c.struct_name==kv['struct_name'] 
        and self.struct.c.schema_name==kv['schema_name'])).\ 
      values(field_len=kv['field_len'], 
        field_type=kv['field_type']) 
     result = u.execute() 

कोड डालने के ठीक संभालती है, लेकिन तालिका में सभी पंक्तियों को अद्यतन करता है। क्या आप इस खंड के वाक्यविन्यास को समझने में मेरी सहायता कर सकते हैं? सभी सुझावों का स्वागत है - अग्रिम धन्यवाद।

संपादित करें: ठीक किया खंड इस तरह दिखता है:

 where((and_(self.struct.c.parent_struct_name==kv['parent_struct_name'], 
        self.struct.c.struct_name==kv['struct_name'], 
        self.struct.c.schema_name==kv['schema_name']))).\ 

यह एक बहुत ही सरल वाक्य रचना है, लेकिन SQLAlchemy की कई परतों को देखते हुए यह निर्धारित करने के लिए वास्तव में इस संदर्भ में लागू किया क्या आश्चर्यजनक रूप से कठिन था।

+4

और_() का उपयोग करने के लिए एक शॉर्टकट एक साथ कई() क्लोज़ को श्रृंखलाबद्ध करना है। तो: .where (ए == 1)। कहीं (बी == 2)। कहीं (सी == 3)। देखें [ डॉक्स] (http: //docs.sq lalchemy.org/en/rel_1_0/core/tutorial.html#conjunctions)। – Arie

उत्तर

8

यह मुझे लगता है कि आप पाइथन "और" ऑपरेशन का उपयोग कर रहे हैं, जो इसके आस-पास के क्लॉज में से केवल एक का मूल्यांकन करेगा। आपको इसके बजाय एसक्यूएलकेमी से "एंड_" फ़ंक्शन का उपयोग करने का प्रयास करना चाहिए। उन दो खंडों को "and_" फ़ंक्शन के अंदर रखें

+0

आह, मुझे लगा कि जवाब इतना आसान होना था। मुझे ट्यूटोरियल या कहीं और में इसका कोई उदाहरण नहीं मिला। कार्यों का वर्णन किया गया था, लेकिन यह मुझे स्पष्ट नहीं था कि यह वह जगह थी जहां मैं उनका उपयोग करूंगा। धन्यवाद। –

1

SQLAlchemy में, tablename.c एक विशेष मूल्य है जिसका उपयोग आप ऐसी स्थितियों का निर्माण करते समय करते हैं जिनका उपयोग एसक्यूएलकेमी द्वारा रनटाइम पर किया जाएगा।

इस विशेष मामले में, आप बस "कह रहे हैं सभी पंक्तियों जहां स्तंभ struct_name नामित struct_put(struct_name="struct_value", schema_name="schema_value") करने में पारित मान से मेल खाता अपडेट करते हैं और स्तंभ schema_name नामित schema_name रूप में पास किए मान से मेल खाता।

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