SQLiteを学んでいこうという連載の24回目です。前回の記事はこちらになります。
前回は、複数個所からアクセスする場合のトランザクション処理をご紹介しました。実際に動かしていくとトランザクションの仕組みがわかってきますよね。
今回はPythonから使用する場合のエラー処理に挑戦します。SQLiteはPythonからも使用できることは、過去にご紹介しました。
Pythonでのエラー処理
それではさっそくPythonでのエラー処理例を見ていきましょう。
まずはAnaconda PromptからSQLte3を起動して、以下を実行します。データベースファイルを新規作成します。
sqlite> .open C:/Work/db_sample.db sqlite> CREATE TABLE sample(id INTEGER UNIQUE,name TEXT,age INTEGER); sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
レコードを1件追加しました。 続いて、Pythonで以下のコードを実行してみましょう。
# モジュールをインポート import sqlite3 # db_sample.dbを開いて操作するカーソルを作成 dbname = r'C:\Work\db_sample.db' conn = sqlite3.connect(dbname) cur = conn.cursor() try: # データを書き込み cur.execute('INSERT INTO sample VALUES(1,"TANAKA",25)') # 設定を確定 conn.commit() except: print('Error') else: print('OK') finally: # SQLで読み込んで表示 for row in cur.execute('SELECT * FROM sample'): print(row) # データベースを閉じる conn.close()
以下の結果が返ってきました。
Error (1, 'TANAKA', 25)
id列にはUNIQUE制約がかかってますので、同じデータのレコードは書き込めないのです。それではデータ書き込みの部分を以下のように書き換えてみましょう。
# データを書き込み cur.execute('INSERT INTO sample VALUES(2,"YAMADA",30)')
今度はid列のデータも含めて異なる内容になっています。結果は以下のようになりました。
OK (1, 'TANAKA', 25) (2, 'YAMADA', 30)
今度はちゃんと書きこめたようです。上手くいった時と上手くいかなかったときの処理に分けることができるのですね。
解説
このような処理をPythonの例外処理と呼びます。例外処理の基本は以下の通りです。
try: メインの処理 except: メインの処理でエラーが発生した場合の処理
このように記述すると、「try:」に記述されているメインの処理でエラーが発生した場合に、「except:」の処理が実行されることになります。今回の例ではUNIQUE制約に引っかかったためエラーの表示がされました。
今回の例では、これ以外に「else:」と「finally:」が登場します。「else:」には「try:」の処理がエラーなしに実行された場合の処理が記述されます。つまり「except:」と「else:」はどちらか片方が実行されることになります。「finally:」は「try:」の処理結果にかかわらず実行される処理が記述されます。これらを総合すると、以下の流れになります。
try: メインの処理 except: メインの処理でエラーが発生した場合の処理 else: メインの処理が正常に実行された場合の処理 finally: メインの処理結果にかかわらず実行される処理
エラーの種類によって処理を分ける場合
エラーの種類によって処理を分ける場合は、「except:」の後にエラー名を記述します。
except エラー名:
今回の場合には、以下のように記述します。
except sqlite3.IntegrityError: print('Error')
「sqlite3.IntegrityError:」はSQLiteのデータベース参照整合性のエラーです。
SQLiteについてのその他のエラーについては、以下を参考にしてください。
次回はPythonとトランザクション
いかがでしょうか。Pythonはプログラム言語なので、今回の様に結果によって処理を変えることができます。次回はPythonからトランザクション処理を使ってみたいと思います。楽しみに!!