Python sqlite3 資料庫操作

如果你需要為應用程式儲存結構化數據,但又不想安裝笨重的資料庫伺服器(如 MySQL 或 PostgreSQL),sqlite3 是你的最佳夥伴。它是 Python 內建的輕量級、基於檔案的資料庫,廣泛用於本地端程式、手機 App 以及小型網站。

基本流程:連線與執行

操作 SQLite 通常遵循以下步驟:連線 -> 建立 Cursor -> 執行 SQL -> 提交 (Commit) -> 關閉。

import sqlite3

# 1. 建立或開啟資料庫檔案 (如果檔案不存在會自動建立)
# 使用 ':memory:' 可以在記憶體中建立臨時資料庫
conn = sqlite3.connect('example.db')

# 2. 建立游標 (Cursor) 物件,用來執行 SQL
cursor = conn.cursor()

# 3. 建立表格
cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER
    )
''')

# 4. 提交更動
conn.commit()

# 5. 關閉連線
conn.close()

新增、讀取、更新與刪除 (CRUD)

插入數據 (Create)

安全提醒:永遠不要使用字串拼接的方式來組 SQL 指令(會導致 SQL 注入攻擊)。請使用問號 ? 作為佔位符。
import sqlite3

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

# 單筆插入
user = ("Alice", 25)
cursor.execute('INSERT INTO users (name, age) VALUES (?, ?)', user)

# 多筆批量插入
users = [("Bob", 30), ("Charlie", 35)]
cursor.executemany('INSERT INTO users (name, age) VALUES (?, ?)', users)

conn.commit()
conn.close()

查詢數據 (Read)

conn = sqlite3.connect('example.db')
cursor = conn.cursor()

cursor.execute('SELECT * FROM users')

# 獲取一筆
# row = cursor.fetchone()

# 獲取所有 (回傳列表,內容為元組)
rows = cursor.fetchall()
for row in rows:
    print(f"ID: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}")

conn.close()

更新與刪除 (Update & Delete)

# 更新
cursor.execute('UPDATE users SET age = ? WHERE name = ?', (26, "Alice"))

# 刪除
cursor.execute('DELETE FROM users WHERE name = ?', ("Bob",))

conn.commit()

使用 Context Manager (with 語法)

為了確保連線正確關閉,建議使用 contextlib 或是自訂封裝。雖然 SQLite 連線物件本身不直接支援 with 來自動關閉連線,但可以用以下方式:

import sqlite3

with sqlite3.connect('example.db') as conn:
    cursor = conn.cursor()
    cursor.execute('SELECT COUNT(*) FROM users')
    print(f"總用戶數: {cursor.fetchone()[0]}")
# 當離開 with 區塊時,會自動 commit,但仍需手動 close() 或是使用 contextlib

實務技巧:將結果轉為字典

預設情況下,fetchall() 回傳的是元組 (Tuple),這在存取欄位時不太方便。你可以設定 row_factory

conn = sqlite3.connect('example.db')
conn.row_factory = sqlite3.Row  # 設定行工廠
cursor = conn.cursor()

cursor.execute('SELECT * FROM users')
row = cursor.fetchone()

print(row['name'])  # Alice (可以像字典一樣使用 KEY 存取)
print(row['age'])   # 26

總結

sqlite3 是學習資料庫操作的最佳入坑工具:

  1. 零配置:不需要安裝 Server。
  2. 標準 SQL:與多數關聯式資料庫語法互通。
  3. 單檔案:遷移與備份非常方便。

對於中大型應用,建議搭配 SQLAlchemyTortoise ORM 等工具,讓資料庫操作更具物件導向風格且易於維護。