2009-12-19 25 views
5

का उपयोग कर काम करने के लिए MySQL स्रोत क्वेरी प्राप्त नहीं कर सकता मैं कोड की निम्न पंक्तियाँ:अजगर mysqldb मॉड्यूल

sql = "source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql" 
cursor.execute (sql) 

जब मैं अपने कार्यक्रम क्रियान्वित, मैं निम्नलिखित त्रुटि मिलती है:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source C:\My Dropbox\workspace\projects\hosted_inv\create_site_db.sql' at line 1

अब मैं एक प्रश्न के रूप में mysql में निम्न को कॉपी और पेस्ट कर सकता हूं:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

और यह सही काम करता है। जब मैं क्वेरी मेरी स्क्रिप्ट द्वारा निष्पादित के लिए क्वेरी लॉग की जाँच करें, यह पता चलता है कि मेरी क्वेरी निम्नलिखित था:

source C:\\My Dropbox\\workspace\\projects\\hosted_inv\\create_site_db.sql 

हालांकि, जब मैं मैन्युअल में पेस्ट और निष्पादित, पूरे create_site_db.sql में विस्तार हो जाता है क्वेरी लॉग और यह उस फ़ाइल में सभी SQL क्वेरी दिखाता है।

क्या मुझे यहां कुछ याद आ रहा है कि mysqldb कैसे पूछता है? क्या मैं एक सीमा में भाग रहा हूँ। मेरा लक्ष्य स्कीमा संरचना बनाने के लिए एक एसक्यूएल स्क्रिप्ट चलाने के लिए है, लेकिन मैं एसक्यूएल फ़ाइल स्रोत करने के लिए एक शेल प्रक्रिया में mysql को कॉल नहीं करना चाहता हूं।

कोई विचार? धन्यवाद!

उत्तर

12

के रूप में अन्य लोगों ने कहा, आप, MySQLdb पायथन एपीआई में

तो आदेश source उपयोग नहीं कर सकते बजाय कि चलाने का फ़ाइल लोड और निष्पादित यह

मान लें कि आपका sql फ़ाइल

create database test; 
है की सुविधा देता है

sql=open("test.sql").read() 

एक तरह की सामग्री पढ़ें घ तो अमल यह

cursor.execute(sql); 

आप नए डेटाबेस "परीक्षण" मिल जाएगा

+0

बहुत बहुत धन्यवाद! sql = open ("test.sql")। पढ़ें() वही करता है जो मैं चाहता हूं। मैं एक खोल प्रक्रिया को फेंकने से बचना चाहता था क्योंकि यह न केवल अनावश्यक महसूस करता था, लेकिन फिर मेरे द्वारा निष्पादित सिस्टम पर स्थापित MySQL क्लाइंट बाइनरी पर निर्भरता होगी। हर किसी की मदद के लिए धन्यवाद! – Chris

+0

आप एफवाईआई के लिए क्रिस – YOU

3

'स्रोत' एक SQL कमांड नहीं है, लेकिन mysql कमांड लाइन क्लाइंट का आंतरिक कमांड है।

7

source कमांड built-in commands में से एक है जो केवल mysql कमांड लाइन क्लाइंट द्वारा मान्यता प्राप्त है। यह किसी भी एपीआई के माध्यम से निष्पादित एक कथन के रूप में समर्थित नहीं है।

कुछ लोग सोचते हैं कि आप बस ";" कथन टर्मिनेटर पर एक SQL स्क्रिप्ट फ़ाइल को विभाजित कर सकते हैं और आपको प्राप्त प्रत्येक पंक्ति पर execute() पर कॉल कर सकते हैं। लेकिन वहाँ कई अपवाद मामलों रहे हैं:

  • बयान हैं कि built-in commandsCONNECT, SOURCE, CHARSET, WARNINGS, QUIT, आदि
  • ध्यान दें कि बिल्ट-इन आदेशों उदाहरण DELIMITER के लिए ; में समाप्त करने के लिए की जरूरत नहीं है की तरह ।
  • ऐसे विवरण जिनमें ; शामिल हैं लेकिन टर्मिनर के रूप में नहीं, जैसे CREATE TRIGGER
  • विवरण जिनमें स्ट्रिंग अक्षर या टिप्पणियों या यहां तक ​​कि उद्धृत पहचानकर्ताओं के अंदर ; शामिल हैं।
  • टिप्पणियाँ लाइनें।

प्रोग्राम स्क्रिप्ट को SQL स्क्रिप्ट लोड करने के लिए, आपको mysql क्लाइंट की कार्यक्षमता की उचित मात्रा को डुप्लिकेट करना होगा। तो यह सबसे अच्छा है अगर आप वास्तव में उस क्लाइंट प्रोग्राम को स्क्रिप्ट के साथ इनपुट के रूप में निष्पादित करने की प्रक्रिया को फोर्क करते हैं।

यह भी देखें:

1

मेरा मानना ​​है कि "स्रोत" आदेश mysql खोल निष्पादन के लिए विशिष्ट है - यह नहीं है एक एसक्यूएल कमांड और सही ढंग से व्याख्या नहीं किया जा सकता है एन एक एसक्यूएल कथन के रूप में निष्पादित।

अपना लक्ष्य प्राप्त करने के लिए, आपको शायद अपनी स्क्रिप्ट फ़ाइल को पढ़ने और व्यक्तिगत एसक्यूएल स्टेटमेंट में इसे पार्स करने की आवश्यकता है, फिर उन्हें अपने कर्सर के साथ एक बार निष्पादित करें।

2

मैं एक ही समस्या में पड़ गए!

एक समाधान के रूप में मैंने पुस्तकालय sqlparse स्थापित किया और sqlparse.split (sql) परिणामों का उपयोग किया। मुझे यह जांचना पड़ा कि sql_parts में एकल कथन के रूप में रिक्त रेखाएं शामिल नहीं हैं ... अन्यथा "वाह" sqlparse बहुत बढ़िया है और वास्तव में मुझे क्या चाहिए!

import sqlparse 
.... 
sql = open("test.sql").read() 
sql_parts = sqlparse.split(sql) 
for sql_part in sql_parts: 
    if sql_part.strip() == '': 
     continue 
    cursor.execute(sql_part) 

FYI करें: यदि आप अपने स्वयं के पर नहीं रन प्रत्येक बयान करते हैं आप मिल सकता है त्रुटि "सिंक्रनाइज़ेशन से बाहर कमानों, तुम अब इस आदेश को नहीं चला सकते हैं"। मुझे यह त्रुटि मिली है जब मैंने अपनी एसक्यूएल फ़ाइल में कुछ और प्रश्न जोड़े - पहली बार नहीं।

+0

+1 का स्वागत करते हैं। –

+0

प्रतिस्थापित बिट की बजाय sql_part.strip() पर्याप्त नहीं है? – ssc

+0

हां, मुझे लगता है कि पट्टी बेहतर और अधिक पोर्टेबल (अद्यतन पोस्ट) होगी। – Rescommunes

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