आपका CREATE तालिका गलत है: यह पहले ('पूर्णांक प्राथमिक कुंजी') कॉलम के लिए नाम निर्दिष्ट नहीं करता है। SQLite अब सोचता है कि फ़ील्ड नामinteger
है, और इसमें कोई डेटा प्रकार परिभाषित नहीं है। आप शायद एक इंटेग्रर प्राथमिक कुंजी फ़ील्ड चाहते थे, क्योंकि यह बहुत ही कुशल है। ऐसा करने के CREATE TABLE syntax सम्मान करते हैं और इसे एक नाम देने के लिए:
CREATE TABLE items
(id INTEGER PRIMARY KEY
, x DOUBLE
, y DOUBLE
);
एक पक्ष नोट के रूप में: मैं युगल के रूप में परिभाषित किया है एक्स और वाई, के बाद से प्रकार को निर्दिष्ट सिर्फ अच्छा अभ्यास है, और यह भी थोड़ा अधिक है कुशल। बेशक, यदि आप उनमें टेक्स्ट रखना चाहते हैं, तो उन्हें टेक्स्ट के रूप में परिभाषित करें। या यदि आप उन्हें मुख्य रूप से पूर्णांक रखना चाहते हैं, तो उन्हें इंटेग्रर के रूप में परिभाषित करें। यदि आप वास्तव में नहीं जानते कि आप किस प्रकार का डेटा डाल रहे हैं तो केवल डेटा प्रकार को छोड़ दें।
अगला, चूंकि INSERT statement केवल फ़ील्ड नामों की अपेक्षा करता है (और उनकी पूर्ण परिभाषा नहीं), SQLite एक सिंटेक्स त्रुटि फेंकता है - ठीक है।
और आखिरकार, क्या आपको लगता है कि यह 'आज' (एक टेक्स्ट वैल्यू) को एक पूर्णांक कॉलम में रखने के लिए थोड़ा मूर्ख नहीं है?!
संपादित करें:
curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y})
मैं छोड़ दिया है: के बाद से आप कहते हैं कि एक्स और वाई चर हैं, साथ ही आप सही रास्ते पर SQL विवरण के लिए उन चर बाइंडिंग के लिए में डाल सकता है id
प्राथमिक कुंजी फ़ील्ड के बाहर, चूंकि SQLite स्वचालित रूप से उत्पन्न हो जाएगा यदि यह मौजूद नहीं है। यदि आप एक स्पष्ट मूल्य पारित करना चाहते हैं, तो आप कर सकते हैं। लेकिन ध्यान रखें कि यह एक पूर्णांक है, और यह अद्वितीय है! SQL विवरण में
:X
और :Y
मापदंडों शब्दकोश की X
और Y
सदस्यों को बताया कि execute
बयान से पीछे नहीं पैरामीटर के रूप में पारित हो जाता है का संदर्भ लें।
बाइंडिंग पैरामीटर एसक्यूएल स्ट्रिंग में पैरामीटर को शामिल करने से both safer and faster है।
SQLite "रेलमार्ग" वाक्यविन्यास आरेख बहुत उपयोगी हैं उदा। http://www.sqlite.org/lang_createtable.html ... शीर्ष स्तर यहां है: http://www.sqlite.org/lang.html –