2013-11-01 5 views
5

वृद्धि नहीं किया गया था मैं SQLite3 का उपयोग कर डेटाबेस बना रहा था। और मेरा पायथन संस्करण 2.7.5 है।SQLite3 धारावाहिक प्रकार

डेटाबेस बनाने से पहले मैंने बस उदाहरण डेटाबेस बनाया और परीक्षण किया कि यह ठीक से काम करेगा या नहीं। और यह विफल रहा कि id भी वृद्धि नहीं हुई थी, यहां तक ​​कि ने इसे serial प्रकार के रूप में घोषित किया था।

data = cur.execute("""SELECT * from sample""") 
t = data.fetchall() 

In [33]: t 
Out[33]: [(None, 3.0), (None, 6.0), (None, 8.0)] 

मैं इस उम्मीद:

import sqlite3 
con = sqlite3.connect('sample.db') 
cur = con.cursor() 
cur.execute("""CREATE TABLE sample(id serial,test real)""") 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,)) 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,)) 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(8,)) 
con.commit() 

तब मैं सभी डेटा दिलवाया:

मैं साधारण डेटाबेस बनाया Out[33]: [(1, 3.0), (2, 6.0), (3, 8.0)] लेकिन, आप देख सकते हैं, id तत्व के सभी None

था

मैं इस समस्या को कैसे हल कर सकता हूं? मुझे पता है कि मैं केवल एक चर को बढ़ाकर और इसे सम्मिलित करके कर सकता हूं। इस तरह:

id += 1 
cur.execute("""CREATE TABLE sample(id serial,test real)""") 
id += 1 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(3,)) 
id += 1 
cur.execute("""INSERT INTO sample(test) VALUES(?)""",(6,)) 

हालांकि, इस भयानक नहीं है? मैं यह नहीं करना चाहता। मैं अपना कोड स्पष्ट और स्मार्ट बनाना चाहता हूं।

+2

आपको 'सेरियल' प्रकार * से * कहां मिला? SQLite में ऐसा कोई कीवर्ड नहीं है। –

+0

वास्तव में? मैंने इसे इंटरनेट में भी बुक में पाया! हम्म, तो क्या कोई विकल्प है जो वही करता है जो मैं चाहता था? – SamuraiT

उत्तर

6

SQLite में serial डेटा प्रकार नहीं है। तालिका बनाने का सही तरीका SQLite में AUTOINCREMENT के साथ है:

CREATE TABLE sample (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
         test REAL); 
+0

बहुत बहुत धन्यवाद यह सहायक है! लेकिन 'न्यूल' क्या करता है? क्या मैं इसे छोड़ सकता हूं? या एक त्रुटि होगी? – SamuraiT

+0

नल का मतलब सिर्फ इतना नहीं है कि यह फ़ील्ड आवश्यक है। और, हाँ, आप इसे छोड़ सकते हैं। –

+0

ठीक है तो मैं समझता हूं कि 'न्यूल' वैकल्पिक है। – SamuraiT

4

ऑटो-वृद्धिशील व्यवहार प्राप्त करने के लिए आपको कॉलम को INTEGER PRIMARY KEY या INTEGER PRIMARY KEY AUTOINCREMENT के रूप में चिह्नित करने की आवश्यकता होगी।

उन दो प्रकारों के बीच का अंतर सूक्ष्म है; बाद वाला फॉर्म कभी भी आईडी का पुन: उपयोग नहीं करेगा। ROWID and the INTEGER PRIMARY KEY दस्तावेज़ीकरण देखें।

+0

ओह, अब मैं समझता हूं कि आपका क्या मतलब है! धन्यवाद! – SamuraiT

+0

मदद की खुशी है! क्षमा करें, आप केवल * एक * उत्तर को स्वीकृत के रूप में चिह्नित कर सकते हैं, दोनों नहीं। :-) –

+0

सबसे पहले, मैं आपके उत्तर को अच्छी तरह समझ नहीं पाया, लेकिन श्री अलेक्सेंडर झुकोव के जवाब के बाद और मैंने जो कुछ कहा वह करने की कोशिश की। और फिर अंत में, मैं समझ गया कि आपका क्या मतलब है। इसलिए मैंने अपना उत्तर स्वीकार्य साइन के रूप में चिह्नित किया यह पहला जवाब था जिसे मैंने समझा। – SamuraiT