Python sqlite3.connect()とは?データベースに接続する方法
Pythonのsqlite3.connect()は、SQLiteデータベースに接続する関数です。
SQLiteはPythonに標準で入っているため、インストールもサーバーの起動も不要で、この1行から始められます。
sqlite3.connect()の基本的な使い方
import sqlite3
conn = sqlite3.connect("test.db")
print(type(conn).__name__)
conn.close()
実行結果:
Connection
戻り値はConnectionオブジェクトです。データベースとのつながりを表します。
ファイルは自動で作られる
test.dbが存在しなければ、その場で新しく作られます。「先にデータベースを作っておく」という手順は不要です。
これは便利な反面、ファイル名をタイプミスしても気づけません。「データが消えた」と思ったら、実は別名の空ファイルに接続していた——というのはよくある事故です。
import sqlite3, os
path = "test.db"
print("接続前に存在するか:", os.path.exists(path))
conn = sqlite3.connect(path)
conn.close()
print("接続後:", os.path.exists(path))
既存のデータベースを開くつもりなら、先に存在確認すると安全です。
フォルダは作られない
import sqlite3
sqlite3.connect("/no/such/dir/a.db")
実行結果:
OperationalError: unable to open database file
ファイルは自動で作られますが、フォルダは作られません。エラーメッセージが「開けない」としか言わないため、原因が分かりにくい部分です。
パスを組み立てるときは、フォルダの存在を先に確認してください。
from pathlib import Path
import sqlite3
path = Path("data/app.db")
path.parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(path)
conn.close()
メモリ上のデータベースを作る
import sqlite3
conn = sqlite3.connect(":memory:")
conn.execute("CREATE TABLE t (x)")
conn.execute("INSERT INTO t VALUES (1)")
print(conn.execute("SELECT * FROM t").fetchall())
conn.close()
実行結果:
[(1,)]
":memory:"を渡すとファイルを作らず、メモリ上だけで動きます。close()すればすべて消えます。
| 用途 | 向いている |
|---|---|
| テストコード | 後片付けが不要 |
| 使い捨ての集計 | ディスクを汚さない |
| SQLの練習 | すぐ作り直せる |
| データを残したい | 向かない(消える) |
よく使う引数
| 引数 | 役割 |
|---|---|
timeout |
ロック待ちの秒数(既定5秒) |
isolation_level |
トランザクションの扱い |
detect_types |
日付型などを自動変換する |
check_same_thread |
別スレッドからの使用を許すか |
timeoutは複数のプロセスが同じファイルを触るときに効きます。SQLiteは書き込み中にファイル全体をロックするため、混み合うと待たされます。
接続したらcursor()でカーソルを作る
import sqlite3
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO users (name) VALUES (?)", ("佐藤",))
conn.commit()
print(cur.execute("SELECT * FROM users").fetchall())
conn.close()
実行結果:
[(1, '佐藤')]
これがsqlite3の基本形です。接続 → カーソル → 実行 → コミット → 切断という流れになります。
カーソルについては「Python Connection.cursor()とは?カーソルを作成する方法」で解説しています。
closeを忘れない書き方
Connectionはwith文に渡せますが、close()はしてくれません(コミットするだけです)。
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(":memory:")) as conn:
with conn:
conn.execute("CREATE TABLE t (x)")
conn.execute("INSERT INTO t VALUES (1)")
print("中:", conn.execute("SELECT * FROM t").fetchall())
conn.execute("SELECT 1")
実行結果:
中: [(1,)]
ProgrammingError: Cannot operate on a closed database.
外側のclosing()が切断、内側のwith conn:がコミットという二重構造です。この形にしておけば、例外が起きても接続が残りません。
SQLiteを選ぶ基準
| 状況 | SQLiteで足りるか |
|---|---|
| 1人で使うツール | 足りる |
| 設定やキャッシュの保存 | 足りる |
| データ分析の作業用 | 足りる |
| 読み取りが中心のWebサイト | 足りることが多い |
| 多人数が同時に書き込む | 向かない |
| 複数サーバーから接続する | 向かない(ファイルなので) |
境界は「同時に書き込む人が何人いるか」です。そこを超えるならPostgreSQLやMySQLを検討してください。
日時を保存する場合はタイムゾーンの扱いに注意が必要です。UTCで保存する方法は「Python zoneinfoとは?タイムゾーンを扱う標準モジュールを解説」で解説しています。
sqlite3.connect()のまとめ
connect()はConnectionを返す。インストール不要- ファイルは自動で作られる(タイプミスに注意)
- フォルダは作られない——
OperationalErrorになる ":memory:"で使い捨てのデータベース- 基本形は接続 → カーソル → 実行 → コミット → 切断
with conn:はコミットするがcloseはしない


