2015-10-04 5 views
10

में मौजूद है या नहीं, मेरे पास एक फ्लास्क एप्लिकेशन है जो MySQL डेटाबेस से कनेक्ट करने के लिए फ्लास्क-स्क्लाक्लेमी का उपयोग करता है।फ्लास्क-स्क्लाक्लेमी जांच करें कि पंक्ति

मैं यह जांचने में सक्षम होना चाहता हूं कि तालिका में कोई पंक्ति मौजूद है या नहीं। कैसे मैं इतना पंक्ति की जाँच करने की तरह एक प्रश्न को संशोधित करेगा मौजूद है:

db.session.query(User).filter_by(name='John Smith') 

मैं this question जो SQLAlchemy का उपयोग करता है लेकिन जिस तरह से कुप्पी के SQLAlchemy के साथ फिट करने के लिए प्रतीत नहीं होता है पर एक समाधान पाया काम करता है:

from sqlalchemy.sql import exists  
print session.query(exists().where(User.email == '...')).scalar() 

धन्यवाद।

+0

किस तरह से पहली क्वेरी करता है * नहीं * जाँच करें कि पंक्ति मौजूद है? –

+0

यदि पंक्ति मौजूद है तो मैं क्वेरी को 'True' या' False' वापस लौटना चाहूंगा। –

+0

दूसरी विधि के साथ क्या गलत है? यह फ्लास्क-स्क्लाक्लेमी में ठीक काम करता है, मैंने अभी कोशिश की है। – davidism

उत्तर

16

चूंकि आप केवल यह देखना चाहते हैं कि उपयोगकर्ता मौजूद है या नहीं, आप पूरी वस्तु से पूछना नहीं चाहते हैं। बस आईडी से पूछें, यह मौजूद है यदि स्केलर रिटर्न कोई नहीं है।

exists = db.session.query(User.id).filter_by(name='davidism').scalar() is not None 

दूसरा क्वेरी आप यह भी पता चला ठीक काम करता है, कुप्पी के SQLAlchemy क्वेरी कि SQLAlchemy कर सकते हैं किसी भी प्रकार को रोकने के लिए कुछ नहीं करता है।

exists = db.session.query(db.exists().where(User.name == 'davidism')).scalar() 
8

लपेटें अंत में एक scalar() कॉल के साथ एक और session.query() में एक .exists() क्वेरी।

exists = db.session.query(
    db.session.query(User).filter_by(name='John Smith').exists() 
).scalar() 
+0

आपको वास्तव में' user.id' से पूछना चाहिए, अन्यथा आप SQLAlchemy को इसकी आवश्यकता से अधिक बड़ी क्वेरी उत्पन्न कर रहे हैं। यह मेरे दूसरे उदाहरण के समान ही है, 'db.exists' के बजाय' query.exists' का उपयोग करके, जो अनिवार्य रूप से वही बात है। – davidism

+0

@ डेविडिज्म SQLAlchemy इसे 'चयन EXISTS में उपयोग करता है (उपयोगकर्ता से चुनें 1 उपयोगकर्ता जहां नाम =?)'। यह 'SELECT उपयोगकर्ता' से उपयोगकर्ता की तुलना में मामूली रूप से लंबी क्वेरी है। उपयोगकर्ता से कहां उपयोगकर्ता नाम। नाम =? ', लेकिन यह वास्तविक प्रश्न पूछने पर अधिक सटीक रूप से प्रतिबिंबित करता है। इसी तरह, पायथन पक्ष पर, कोड उपयोगकर्ता को पुनर्प्राप्त करने के लिए बहुत कुछ दिखता है, जो क्वेरी को याद रखने और समझने में आसान बनाता है। – lyschoening

+0

दोनों अलग-अलग प्रश्नों का उत्पादन करते हैं? दिलचस्प है, मुझे जांच करनी होगी, थोड़ी देर में ऐसी कोई क्वेरी नहीं की है। – davidism

0

अपहरण माफ कर दो, लेकिन ... यहाँ दिए गए निर्देशों के मैं क्षेत्र की विशिष्टता की जाँच करने के लिए निम्न WTForm सत्यापनकर्ता बनाया

class Unique(object): 
    def __init__(self, column, session, message="Already exists."): 
     self.column = column 
     self.session = session 
     self.message = message 

    def __call__(self, form, field): 
     if field.data == field.object_data: 
      return # Field value equals to existing value. That's ok. 
     model = self.column.class_ 
     query = model.query.filter(self.column == field.data).exists() 
     if self.session.query(query).scalar(): 
      raise ValidationError(self.message) 

यह इस

class Register(Form): 
    email = EmailField('Email', [Unique(User.email, db.session)]) 
की तरह इस्तेमाल किया जाएगा

हालांकि, मैं एपीआई रखना चाहता हूं जिसे दूसरे पैरा

के रूप में डीबी सत्र की आवश्यकता नहीं है

क्या मॉडल से डीबी सत्र प्राप्त करने का कोई तरीका है? सत्र के बिना पूरे अस्तित्व को अपने अस्तित्व की जांच करने से बचाना असंभव प्रतीत होता है।

-2

सोचो davidism के जवाब में कोई गलती नहीं है, यह मेरे लिए काम करता है:

exists = db.session.query(**User**).filter_by(name='davidism').scalar() is not None 
+0

यह एक टाइपो नहीं है, मैं विशेष रूप से आईडी से पूछताछ कर रहा हूं क्योंकि पूरे ऑब्जेक्ट को प्राप्त करना अस्तित्व की जांच के लिए अधिक है। – davidism

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