2017-06-15 4 views
1

pythonスクリプトを使用してテキストファイルで作成されたSQLコマンドを実行しようとしています。しかし、SQLコマンドが失敗した場合、pythonスクリプトはエラーをスローし、その間にテキストファイルの実行を停止します。その結果、実行されるコマンドは少なく、残っているコマンドはほとんどありません。Pythonで例外を取得した後にtxtファイルを読み続ける方法

私のコードがエラーをスローし、テキストファイルの残りのコマンドを実行し続けることを期待しています。

読書のための私のコード:

import sqlite3 as sqlite 
File_Name = input(" please provide text file name : ") 
DB_Name = input (" Please provide the Database Name : ") 
connection = sqlite.connect(DB_Name) 
cursor = connection.cursor() 

Text_File = open (File_Name,'r') 
Text = Text_File.read() 
Text_File.close() 
try: 
    cursor.executescript(Text) 
except sqlite.Error as e: 
    print ("sql command error ",e) 
connection.commit() 
connection.close() 

テキストファイルは次のようである:ここ

drop table test_p; 
drop table test_p1; 
drop table test_p2; 

create table test_p(a number); 
create table test_p1(a number); 
create table test_p2(a number); 

insert into test_p values(1); 
insert into test_p values(2); 
insert into test_p1 values(3); 
insert into test_p1 values(4); 
insert into test_p2 values(5); 
insert into test_p2 values(6); 

テーブルtest_p1が存在しないと私はスクリプトを実行しているならば、test_pが削除されます例外がスローされます。

+3

なぜ 'DROP TABLE ... IF EXISTS'を使用しないのですか? –

答えて

1

あなたは1ファイル1内の行を読み込み、実行することができる:

for line in open(File_Name,'r'): 
    try: 
     cursor.executescript(line) 
    except sqlite.Error as e: 
     print ("sql command error ", e) 
+1

1行に 'startscript'を使うのはやや難題です。 'execute'instだけを使用すると、コードはより読みやすくなります(実際の操作をよりよく表現しています)。 – JohanL

+0

さらに、ファイルを開くときに 'with'を使用するか、少なくとも' for'ループの後にそれを閉じてください。 (あなたはこれを知っているかもしれませんが、ここで読んでいる誰かがそれを見逃しているかもしれません)。 – JohanL

+0

助けてくれてありがとう。私は言及した点に留意します。 – newbie

0

コメントで指摘したように、特定のエラーのために、IF EXISTSを使用して、それを回避することができます。一般的なケースでは、あなたは、ループ、あなたの入力を可能性があり、executescriptするのではなく、各ライン上executeを使用します。

import sqlite3 as sqlite 
File_Name = input(" please provide text file name : ") 
DB_Name = input (" Please provide the Database Name : ") 
connection = sqlite.connect(DB_Name) 
cursor = connection.cursor() 

with open (File_Name,'r') as file: 
    for line in file: 
     try: 
      cursor.execute(line) 
     except sqlite.Error as e: 
      print ("sql command error ",e) 

connection.commit() 
connection.close() 

これは、エラーを報告するために、各問題のある行をリードしますが、その後、次の行のcontinnue実行。

+0

ありがとうございました。 – newbie

+0

しかし、あなたは他の答えを受け入れましたか? :-) – JohanL

+0

どちらも動作しています:-) – newbie

関連する問題