मेरा मानना है कि सबसे कुशल "क्या यह मौजूद है" क्वेरी सिर्फ count
करने के लिए है :
sqlq = "SELECT COUNT(1) FROM settings WHERE status = '1'"
xcnx.execute(sqlq)
if xcnx.fetchone()[0]:
# exists
डेटाबेस को फ़ील्ड या पंक्तियों पर कोई भी गिनती संचालन करने के लिए कहने के बजाय, आप इसे केवल 1 या 0 वापस करने के लिए कह रहे हैं यदि परिणाम किसी भी मैच का उत्पादन करता है। यह बहुत अधिक कुशल है कि वास्तविक रिकॉर्ड लौटाना और ग्राहक पक्ष की राशि की गणना करना क्योंकि यह दोनों पक्षों पर क्रमांकन और अक्रमांकन और डेटा स्थानांतरण को बचाता है।
In [22]: c.execute("select count(1) from settings where status = 1")
Out[22]: 1L # rows
In [23]: c.fetchone()[0]
Out[23]: 1L # count found a match
In [24]: c.execute("select count(1) from settings where status = 2")
Out[24]: 1L # rows
In [25]: c.fetchone()[0]
Out[25]: 0L # count did not find a match
count(*)
count(1)
. के समान होने जा रहा है . आपके मामले में क्योंकि आप एक नई तालिका बना रहे हैं, यह 1 परिणाम दिखाने जा रहा है। यदि आपके पास 10,000 मैच हैं तो यह 100000 होगा। लेकिन आप अपने परीक्षण में केवल इस बात की परवाह करते हैं कि क्या यह 0 नहीं है, इसलिए आप एक बूल ट्रुथ टेस्ट कर सकते हैं।
अपडेट करें
वास्तव में, यह केवल पंक्ति गणना का उपयोग करने के लिए और भी तेज़ है, और परिणाम भी प्राप्त नहीं करता है:
In [15]: if c.execute("select (1) from settings where status = 1 limit 1"):
print True
True
In [16]: if c.execute("select (1) from settings where status = 10 limit 1"):
print True
In [17]:
यह भी है कि कैसे django का ORM एक queryObject.exists()
करता है .