क्या python में cx_oracle का उपयोग कर एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करने का कोई तरीका है।cx_oracle से एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करें?
मुझे एसक्यूएल फाइलों में अपनी निर्माण तालिका स्क्रिप्ट निष्पादित करने की आवश्यकता है।
क्या python में cx_oracle का उपयोग कर एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करने का कोई तरीका है।cx_oracle से एक एसक्यूएल स्क्रिप्ट फ़ाइल निष्पादित करें?
मुझे एसक्यूएल फाइलों में अपनी निर्माण तालिका स्क्रिप्ट निष्पादित करने की आवश्यकता है।
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)
स्क्रिप्ट चलाने के लिए 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" शब्द के लिए स्कैन करें यदि आप सिर्फ यह जांचना चाहते हैं कि यह ठीक है या नहीं।
स्वीकार्य उत्तर पीएल/एसक्यूएल के मामले में काम नहीं करता है .. इस मामले में यह sqlplus बिट ठीक है। –
';' पर विभाजित होने पर स्ट्रिंग अक्षर होते हैं जिनमें अर्धविराम होते हैं; यह थोड़ा सा स्कैनिंग ले सकता है। – 9000
सहमत - यह मेरा मुद्दा था जब मैंने कहा "मैं मान रहा हूं कि"; "चरित्र का उपयोग केवल फाइल के भीतर ऑरैकल एसक्यूएल स्टेटमेंट को सीमित करने के लिए किया जाता है।" हालांकि आपने स्पष्ट मुद्दा स्पष्ट रूप से कहा है। धन्यवाद! – chipchilders