2011-09-23 10 views
6

क्या python में cx_oracle का उपयोग कर एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करने का कोई तरीका है।cx_oracle से एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करें?

मुझे एसक्यूएल फाइलों में अपनी निर्माण तालिका स्क्रिप्ट निष्पादित करने की आवश्यकता है।

उत्तर

7

PEP-249, जो cx_oracle अनुपालन करने का प्रयास करता है, वास्तव में ऐसा कोई तरीका नहीं है।

हालांकि, प्रक्रिया बहुत सीधी आगे होनी चाहिए। फ़ाइल की सामग्री को एक स्ट्रिंग में खींचें, इसे ";" पर विभाजित करें चरित्र, और उसके बाद परिणामस्वरूप सरणी के प्रत्येक सदस्य पर निष्पादन करें। मुझे लगता है कि ";" चरित्र का उपयोग केवल फाइल के भीतर ऑरैकल एसक्यूएल स्टेटमेंट को सीमित करने के लिए किया जाता है।

f = open('tabledefinition.sql') 
full_sql = f.read() 
sql_commands = full_sql.split(';') 

for sql_command in sql_commands: 
    curs.execute(sql_command) 
+3

';' पर विभाजित होने पर स्ट्रिंग अक्षर होते हैं जिनमें अर्धविराम होते हैं; यह थोड़ा सा स्कैनिंग ले सकता है। – 9000

+1

सहमत - यह मेरा मुद्दा था जब मैंने कहा "मैं मान रहा हूं कि"; "चरित्र का उपयोग केवल फाइल के भीतर ऑरैकल एसक्यूएल स्टेटमेंट को सीमित करने के लिए किया जाता है।" हालांकि आपने स्पष्ट मुद्दा स्पष्ट रूप से कहा है। धन्यवाद! – chipchilders

9

स्क्रिप्ट चलाने के लिए SQL * प्लस (ओरेकल के कमांड लाइन टूल) का उपयोग करने का एक और विकल्प है। आप इसे subprocess मॉड्यूल का उपयोग करके पायथन से कॉल कर सकते हैं - यहां एक अच्छी walkthrough है: http://moizmuhammad.wordpress.com/2012/01/31/run-oracle-commands-from-python-via-sql-plus/

tables.sql की तरह एक स्क्रिप्ट (जानबूझकर त्रुटि पर ध्यान दें) के लिए:

CREATE TABLE foo (x INT); 

CREATE TABLER bar (y INT); 

आप निम्नलिखित की तरह एक समारोह का उपयोग कर सकते हैं:

from subprocess import Popen, PIPE 

def run_sql_script(connstr, filename): 
    sqlplus = Popen(['sqlplus','-S', connstr], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
    sqlplus.stdin.write('@'+filename) 
    return sqlplus.communicate() 

connstr एक ही कनेक्शन cx_Oracle के लिए इस्तेमाल किया स्ट्रिंग है। filename स्क्रिप्ट का पूरा पथ है (उदा। 'C:\temp\tables.sql')। फ़ंक्शन एक SQL प्लस सत्र (इसके स्वागत संदेश को चुप करने के लिए '-S' के साथ) खोलता है, फिर उसे भेजने के लिए "@filename" पंक्तियों को खोलता है - यह स्क्रिप्ट चलाने के लिए SQL प्लस बताएगा।

sqlplus.communicate stdin को आदेश भेजता है, SQL * प्लस सत्र को समाप्त करने के लिए प्रतीक्षा करता है, फिर एक tuple के रूप में (stdout, stderr) देता है। - आप उपयोगकर्ता यदि करने के लिए पूरे उत्पादन दिखा सकता है

>>> output, error = run_sql_script(connstr, r'C:\temp\tables.sql') 
>>> print output 

Table created. 

CREATE TABLER bar (
     * 
ERROR at line 1: 
ORA-00901: invalid CREATE command 

>>> print error 

यह, एक छोटे से पार्स लगेगा कि तुम क्या अपने कार्यक्रम के बाकी पर वापस आना चाहते हैं पर निर्भर करता: उपरोक्त tables.sql के साथ इस समारोह कॉलिंग निम्नलिखित उत्पादन दे देंगे यह इंटरैक्टिव है, या "ERROR" शब्द के लिए स्कैन करें यदि आप सिर्फ यह जांचना चाहते हैं कि यह ठीक है या नहीं।

+0

स्वीकार्य उत्तर पीएल/एसक्यूएल के मामले में काम नहीं करता है .. इस मामले में यह sqlplus बिट ठीक है। –