これはなに
Python標準ライブラリのsqlite3でwith構文を使って自動で閉じるCursurオブジェクトを生成する方法です。
普通に使うと、毎回例外処理をしながらcur.close()を書く必要があり大変面倒です。
またこれを使うことで、似たAPI形式を持つpsycopg2
とのコードの共通化ができます。
実装
import sqlite3
class AutoCloseCursur(sqlite3.Cursor):
def __init__(self, connection):
super().__init__(connection)
def __enter__(self):
return self
def __exit__(self, *args):
self.close()
どう変わるのか
このような実装をせずに書くと、以下のようなコードになります
with sqlite3.connect(DATABASE) as conn:
cur = conn.cursur()
cur.execute(SQL_QUERY)
cur.close()
conn.commit()
これには以下の問題点があります
- 読みづらい
- curを明示的に閉じる必要がある
- 2.より、例外が発生したときにファイルを開いたままになってしまう
上で示したような自作クラスを使うことで、この3つ全てを解決することができます。
使用例
with sqlite3.connect(DATABASE) as conn:
with AutoCloseCursur(conn)
cur.execute(SQL_QUERY)
conn.commit()
上手く組み合わせることで、PostgreSQLとSQLiteのDBを同じコードで扱うことができるようになります