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 是學習資料庫操作的最佳入坑工具:
- 零配置:不需要安裝 Server。
- 標準 SQL:與多數關聯式資料庫語法互通。
- 單檔案:遷移與備份非常方便。
對於中大型應用,建議搭配 SQLAlchemy 或 Tortoise ORM 等工具,讓資料庫操作更具物件導向風格且易於維護。