2016-04-12 6 views
1

test.sqlを私のC:ドライブ上のフォルダに置くことを検討しています。私はcx_Oracleで遊んでいて、うまく動作しません。Pythonを介してSQLスクリプト全体を実行

test.sqlには以下が含まれます。

CREATE TABLE MURRAYLR.test 
(customer_id number(10) NOT NULL, 
    customer_name varchar2(50) NOT NULL, 
    city varchar2(50) 
); 

CREATE TABLE MURRAYLR.test2 
(customer_id number(10) NOT NULL, 
    customer_name varchar2(50) NOT NULL, 
    city varchar2(50) 
); 

これは私のコードです:

import sys 
import cx_Oracle 
connection = cx_Oracle.connect('user,'password,'test.ora') 
cursor = connection.cursor() 
f = open("C:\Users\desktop\Test_table.sql") 
full_sql = f.read() 
sql_commands = full_sql.split(';') 
for sql_command in sql_commands: 
    cursor.execute(sql_command) 
    cursor.close() 
connection.close() 
+0

あなたはOracleと言いますが、あなたのコードはOracleのように見えますが、これをSQL Serverでタグ付けしました。どのDBMSを使用していますか? –

+0

Oracle BDでOracle Developerを使用しています –

+0

cx_oracleで何を試しましたか?これは役立ちます:http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html ?? – trans1st0r

答えて

1

この回答は、あなたのtest.sqlファイルに新しい行 '\ n \'(SQLコードのコピー貼り付けから得たもの)の文字が含まれている場合にのみ関係します。存在する場合は、コード内でそれらを削除する必要があります。上記のチェック、「\ n個の問題を解決するには

print full_sql 

を行い、

sql_commands = full_sql.replace('\n', '').split(';')[:-1] 

するに役立つはずです。

sql文字列を分割するときに '\ n'を削除し、最後に空の文字列トークンを削除します。

+0

私はあなたがそれを釘付けにしていたが、私はSQLに余分なコードを少し追加し、再び破った。 BEGIN EXECUTE IMMEDIATE 'DROP table test1'; 例外 それ以外の場合 IF SQLCODE!= -942 THEN RAISE; END IF; END; –

+0

エラーを表示できますか?私はこの新しい文字列で、いくつかのステートメントの周りに空白があることが分かるので、これは役に立ちます: 'sql_commands = [i.strip()for i for sql_commands] ' – trans1st0r

0

MURRAYLR.testは、私が使用した任意のDBMSに許容可能なテーブル名ではありません。 cx_oracle.connectの接続オブジェクトにはすでにスキーマが選択されている必要があります。別のスキーマに切り替えるには、接続オブジェクトのcurrent_schemaフィールドを設定するか、using <Schemaname>;をSQLファイルに追加します。 スキーマが存在することを確認してください。

+0

欠けています。最後は問題ではありません。 http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html – trans1st0r

+0

を参照してください。SQLはうまく動作せず、MURRAYLRスキーマにテーブルを作成します。あなたの提案をありがとう。 –

+0

@LeeMurray拡張された答えをご覧ください。 – ventsyv

関連する問題