Pythonでcx_oracleを使用してSQLスクリプトファイルを実行する方法はありますか?cx_oracleからSQLスクリプトファイルを実行しますか?
私はSQLファイルでテーブル作成スクリプトを実行する必要があります。
Pythonでcx_oracleを使用してSQLスクリプトファイルを実行する方法はありますか?cx_oracleからSQLスクリプトファイルを実行しますか?
私はSQLファイルでテーブル作成スクリプトを実行する必要があります。
PEP-249(cx_oracleが準拠しようとする)には、実際にはそのような方法はありません。
ただし、プロセスはかなり簡単です。ファイルの内容を文字列に引っ張り、 ";"で分割します。結果の配列の各メンバーで.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)
また、SQL * Plus(Oracleのコマンドライン・ツール)を使用してスクリプトを実行することもできます。 subprocess
モジュールを使ってこれをPythonから呼び出すことができます。ここにはウォークスルーがあります: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)をタプルとして返します。場合は、ユーザーに全体の出力を示すことができる - これはあなたのプログラムの残りの部分に戻りたいものに応じて、少し解析がかかります
>>> 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
でこの関数を呼び出すと、次のような出力が得られますインタラクティブであるか、OKであるかどうかを確認したい場合は「ERROR」という単語をスキャンします。
PL/SQLの場合、受け入れられた回答は機能しません。この場合、このsqlplusビットは正常です。 –
セミコロンを含む文字列リテラルがある場合、 ';'で分割すると失敗します。これは簡単なスキャンの少しを取るかもしれません。 – 9000
合意 - それは私が "私は"; "文字がファイル内のOracle SQL文を区切るためにのみ使用されていると仮定していると言いました。あなたは明白な問題をより明確に述べました。ありがとう! – chipchilders