Python で cx_oracle を使用して SQL スクリプト ファイルを実行する方法はありますか。
SQL ファイルでテーブル作成スクリプトを実行する必要があります。
もう 1 つのオプションは、SQL*Plus (Oracle のコマンド ライン ツール) を使用してスクリプトを実行することです。モジュールを使用して Python からこれを呼び出すことができsubprocess
ます - ここに良いウォークスルーがあります: 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 Plus セッションを開き ('-S' を使用してウェルカム メッセージを無音にします)、送信する "@filename" をキューに入れます。これにより、SQL Plus にスクリプトを実行するように指示します。
sqlplus.communicate
コマンドを stdin に送信し、SQL*Plus セッションが終了するのを待ってから、(stdout, stderr) をタプルとして返します。上記でこの関数を呼び出すtables.sql
と、次の出力が得られます。
>>> 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
プログラムの残りの部分に何を返したいかによって、これには少し解析が必要になります。対話型の場合は出力全体をユーザーに表示できます。正常に実行されました。
cx_oracle が準拠しようとしているPEP-249には、実際にはそのような方法はありません。
ただし、プロセスは非常に簡単です。ファイルの内容を文字列にプルし、「;」で分割します。結果の配列の各メンバーで .execute を呼び出します。「;」が 文字は、ファイル内の Oracle SQL ステートメントを区切るためにのみ使用されます。
f = open('tabledefinition.sql')
full_sql = f.read()
sql_commands = full_sql.split(';')
for sql_command in sql_commands:
curs.execute(sql_command)