3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonのsqlite3で自動で閉じるCursurを使う

Posted at

これはなに

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()

これには以下の問題点があります

  1. 読みづらい
  2. curを明示的に閉じる必要がある
  3. 2.より、例外が発生したときにファイルを開いたままになってしまう

上で示したような自作クラスを使うことで、この3つ全てを解決することができます。

使用例

with sqlite3.connect(DATABASE) as conn:
    with AutoCloseCursur(conn)
        cur.execute(SQL_QUERY)
    conn.commit()

上手く組み合わせることで、PostgreSQLとSQLiteのDBを同じコードで扱うことができるようになります

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?