1. ホーム
  2. python

[解決済み] Python SQLiteでデータベース接続を閉じない場合はどうすればよいですか?

2023-03-27 06:11:25

質問

以下のようなことをやっています。

conn = sqlite3.connect(db_filename)

with conn:
    cur = conn.cursor()
    cur.execute( ... )

with は自動的に変更をコミットします。しかし、ドキュメントには接続を閉じることについては何も書かれていません。

実際には、私は conn を使うことができます(テスト済み)。したがって、コンテキスト・マネージャが接続を閉じていないようです。

手動で接続を閉じなければならないのでしょうか。開いたままにしておくとどうなりますか?

EDIT

私の所見です。

  • 接続が閉じられていない をコンテキストマネージャでテストして確認しました。そこで __exit__ を実行すると、コンテキスト・マネージャは変更をコミットするだけです。 conn.commit()
  • with conn そして with sqlite3.connect(db_filename) as conn は同じなので、どちらを使っても接続は維持されます。
  • with ステートメントは新しいスコープを作成しないので、with のスイートの中で作成されたすべての変数は、その外側からアクセスできます。
  • 最後に、手動で接続を閉じる必要があります。

どのように解決するのですか?

SQLite データベースを閉じないとどうなるかという具体的な質問に対する答えは非常にシンプルで、どのプログラミング言語でも SQLite を使用する場合に当てはまります。 接続がコードによって明示的に、またはプログラムの終了によって暗黙的に閉じられると、未処理のトランザクションはすべてロールバックされます。 (ロールバックは、実際には、次にデータベースを開くプログラムによって行われます。) 未処理のトランザクションが開いていない場合は、何も起こりません。

これは、プロセス終了前に常にデータベースを閉じることについてあまり心配する必要がないこと、そして、適切な時点でそれらを開始しコミットすることを確実にするトランザクションに注意を払う必要があることを意味します。