2010-03-13 10 views
29

मेरे पास क्वेरी कथन के साथ कर्सर निम्नानुसार है:पाइथन के साथ SQLite में एक पंक्ति के अस्तित्व की जांच कैसे करें?

cursor.execute("select rowid from components where name = ?", (name,)) 

मैं घटकों के अस्तित्व की जांच करना चाहता हूं: नाम और एक पायथन चर पर वापस जाना। मैं यह कैसे करूँ?

+2

आप अगर यह शून्य या यदि स्तंभ बिल्कुल स्कीमा में मौजूद है की जाँच करना चाहते हैं ?? – AndiDog

+0

नहीं, कॉलम नाम अद्वितीय है, इसलिए मैं उस नाम के साथ घटकों का चयन करना चाहता हूं, अगर यह मौजूद है या नहीं। क्षमा करें मुझे कुछ विवरण याद आया –

+1

यदि आपको समाधान मिल गया है, तो आपको इस प्रश्न को उत्तर के रूप में चिह्नित करने के लिए एक उत्तर का चयन करना चाहिए। अधिमानतः किसी और का जवाब जिसने आपको सही तरीके से इंगित किया। –

उत्तर

69

के बाद से name अद्वितीय हैं, मैं वास्तव में अपने (ओ पी के) fetchone या fetchall का उपयोग कर के अपने प्रारंभिक सुझाव से अधिक SELECT count(*) का उपयोग करने का एलेक्स मार्टेली की विधि का उपयोग करने की विधि के पक्ष में।

fetchall किसी सूची में परिणाम (आमतौर पर डेटा की एकाधिक पंक्तियां) को लपेटता है। चूंकि name एस अनूठे हैं, fetchall सूची में केवल एक टुपल (उदाहरण के लिए [(rowid,),] या एक खाली सूची []) के साथ एक सूची लौटाती है। यदि आप rowid जानना चाहते हैं, तो fetchall का उपयोग करके आपको सूची के माध्यम से जाने और टुपल की आवश्यकता होती है rowid

का प्रयोग के बाद से आप सिर्फ एक पंक्ति, (rowid,) या None मिल fetchone इस मामले में बेहतर है करने के लिए। rowid पर प्राप्त करने के लिए (बशर्ते वहाँ एक है) तुम सिर्फ टपल के पहले तत्व को उठाने के लिए है

यदि आपको विशेषपर कोई परवाह नहीं हैऔर आप सिर्फ यह जानना चाहते हैं कि हिट, है तो आप एलेक्स मार्टेलि के सुझाव, SELECT count(*) का उपयोग कर सकते हैं, जो (1,) या (0,) पर वापस आ जाएगा। सेटअप करने के लिए

पहले कुछ बॉयलर-प्लेट कोड एक खिलौना SQLite तालिका:

import sqlite3 
connection = sqlite3.connect(':memory:') 
cursor=connection.cursor() 
cursor.execute('create table components (rowid int,name varchar(50))')  
cursor.execute('insert into components values(?,?)', (1,'foo',)) 

fetchall का उपयोग करना:

for name in ('bar','foo'): 
    cursor.execute("SELECT rowid FROM components WHERE name = ?", (name,)) 
    data=cursor.fetchall() 
    if len(data)==0: 
     print('There is no component named %s'%name) 
    else: 
     print('Component %s found with rowids %s'%(name,','.join(map(str, next(zip(*data)))))) 

पैदावार:

यहाँ कुछ उदाहरण कोड है

There is no component named bar 
Component foo found with rowids 1 

का उपयोग fetchone:

for name in ('bar','foo'): 
    cursor.execute("SELECT rowid FROM components WHERE name = ?", (name,)) 
    data=cursor.fetchone() 
    if data is None: 
     print('There is no component named %s'%name) 
    else: 
     print('Component %s found with rowid %s'%(name,data[0])) 

पैदावार:

There is no component named bar 
Component foo found with rowid 1 

SELECT count(*) का उपयोग करना:

for name in ('bar','foo'): 
    cursor.execute("SELECT count(*) FROM components WHERE name = ?", (name,)) 
    data=cursor.fetchone()[0] 
    if data==0: 
     print('There is no component named %s'%name) 
    else: 
     print('Component %s found in %s row(s)'%(name,data)) 

पैदावार:

There is no component named bar 
Component foo found in 1 row(s) 
+0

हाय unutbu, क्या आप डेटा के असाइनमेंट के बाद पाइथन कथन पर स्पष्ट हो सकते हैं? मैं अजगर –

+0

लिए नया हूँ लेकिन, 'बनाने तालिका घटकों' मैं अद्वितीय संपत्ति है में स्तंभ 'नाम', कि महत्वपूर्ण के रूप में अच्छी तरह से है। कोड साझा करने के लिए धन्यवाद। –

+0

क्या यह python3 के लिए भी काम करता है? –

15

मुझे जवाब मिला है।

exist = cursor.fetchone() 
if exist is None: 
    ... # does not exist 
else: 
    ... # exists 
+0

मैं यह पहली 'cursor.execute करके काम मिल गया (" MyTable से * का चयन करें ")' – nobism

5

दोनों मौजूदा जवाब के रूप में (अपने खुद के और @ unutbu के) का कहना है, चाल है आप जाँच करने के लिए प्राप्त कर रहा है में से कुछ तरह करना है, SELECT, को क्रियान्वित करने के बाद की आवश्यकता है कि क्या वहाँ कोई भी परिणाम किया गया है वे मूल रूप से बराबर दृष्टिकोण कर रहे हैं यह देखते हुए कि आप एक UNIQUE बाधा उल्लेख - का चयन करें या नहीं (चाहे आप एक ही साथ यह कर लाए जाने और कोई भी के लिए जाँच, या एक लाने-सब और एक खाली सूची के लिए जाँच करने के लिए, एक सीमांत का अंतर है)।

एक बहुत ही सीधा जवाब के लिए, आप कर सकते थे select count(*) from components where name = ?, बल्कि rowid का चयन, की तुलना में अगर आप सभी परवाह है कि क्या नाम लिए दिया गया मान मौजूद है या नहीं (करने के लिए करता है, तो सब पर, क्या पंक्ति आईडी इसके चालू होने के बारे में देखभाल, विपरीत है ;-)। इस चयन को क्रियान्वित करने, और परिणाम प्राप्त करने में कठिनाई है, तो आप 0, 1 देता है यदि मान अनुपस्थित है अगर यह मौजूद है (कोई अन्य परिणाम क्या आप स्तंभ name पर UNIQUE बाधा ;-) के बारे में एक टिप्पणी में उल्लेख दिया संभव है।

+0

हाय एलेक्स, वास्तव में, मैं अगर यह मौजूद है की जाँच करें और साथ ही rowid प्राप्त करना चाहते हैं। इसलिए, यही कारण है कि मैंने पंक्तिबद्ध को चयनित कथन में रखा है। आपका समाधान पूरी तरह से अच्छी तरह से काम करता है, लेकिन यदि यह मौजूद है, तो मुझे परिणाम प्राप्त करने के लिए एक और चयन करना होगा। क्या आप कृपया कुछ तुलना करने के लिए कुछ कोडों की जांच करने का उदाहरण दे सकते हैं जो मैं कर सकता हूं? (एक को लाएं और किसी भी प्रकार की जांच न करें- सभी को चेक करें और खाली जांचें) क्षमा करें, मैं पाइथन और एसक्लाइट 3 –

+0

@fx के लिए नया हूं, अगर आपको पंक्ति की आवश्यकता है तो आपके स्वयं के उत्तर में कोड ठीक है और अनिवार्य रूप से unutbu के समान है (एक के साथ 'यदि डेटा:' पर ​​एक गैर-खाली सूची की जांच करने के लिए परीक्षण करें) - किसी भी गहरी तुलना की आवश्यकता नहीं है। –

-1

तो यह और भी कम करने के लिए ...:

row = cursor.fetchone() 

if row: 
    print "row is present" 
else: 
    print "row is not present" 
संबंधित मुद्दे