11

Python で cx_oracle を使用して SQL スクリプト ファイルを実行する方法はありますか。

SQL ファイルでテーブル作成スクリプトを実行する必要があります。

4

2 に答える 2

14

もう 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_Oraclefilenameスクリプトへのフル パスです (例: '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

プログラムの残りの部分に何を返したいかによって、これには少し解析が必要になります。対話型の場合は出力全体をユーザーに表示できます。正常に実行されました。

于 2012-10-09T10:04:27.320 に答える
11

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)
于 2011-09-23T17:35:29.247 に答える