2011-03-05 15 views
5

इस कोड:sqlite3.OperationalError: निकट "एक्स": सिंटेक्स त्रुटि

conn = connect('emails.db') 
curs = conn.cursor() 

curs.execute('''create table items 
    (integer primary key, X, Y)''') 

curs.execute("INSERT INTO items (integer primary key, X, Y) VALUES ('today', 'X', 'Y')") 

connection.commit() 

रिटर्न:

sqlite3.OperationalError: near "primary": syntax error

क्यों? मैं नहीं देखता कि मैं क्या गलत कर रहा हूं। मैं जो मूल्य डाल रहा हूं वह सभी चर बीटीडब्ल्यू हैं।

+1

SQLite "रेलमार्ग" वाक्यविन्यास आरेख बहुत उपयोगी हैं उदा। http://www.sqlite.org/lang_createtable.html ... शीर्ष स्तर यहां है: http://www.sqlite.org/lang.html –

उत्तर

9

आपका 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 है।

+0

क्या करें: एक्स और: वाई sqlite3 पायथन ड्राइवर में काम करते हैं? दस्तावेज वाला एकमात्र प्रतिस्थापन पैरामीटर '?' है। – SilverbackNet

+1

@ सिल्वरबैकनेट: वे [इस टिप्पणी] के अनुसार भी करते हैं (http://stackoverflow.com/a/1010804/60590) – Martijn

+0

धन्यवाद! इससे थोड़ा लचीलापन जोड़ा गया है, मैंने सोचा था कि जब मैं SQLite का उपयोग करना शुरू कर दूंगा तो मैं खो जाऊंगा। – SilverbackNet

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