前面幾天的收藏資料都寫在 sample_media 裡。這有一個問題:每次新增作品都得修改 Python 程式碼,而且重新啟動後,程式中手動修改的內容也不方便管理。
今天要改用 SQLite,讓作品資料存放在資料庫檔案中。
步驟 1:建立 database.py
在專案根目錄建立 database.py:
import sqlite3from pathlib import Path# 將資料庫放在目前專案目錄BASE_DIR = Path(file).resolve().parentDATABASE_PATH = BASE_DIR / "media.db"def get_db_connection(): """建立資料庫連線。""" connection = sqlite3.connect(DATABASE_PATH) connection.row_factory = sqlite3.Row return connectiondef init_db(): """建立作品資料表。""" connection = get_db_connection() connection.execute(""" CREATE TABLE IF NOT EXISTS media ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, media_type TEXT NOT NULL CHECK(media_type IN ('movie', 'game')), year INTEGER, genre TEXT, status TEXT NOT NULL DEFAULT 'backlog', rating INTEGER CHECK(rating IS NULL OR rating BETWEEN 1 AND 10), notes TEXT DEFAULT '', cover_url TEXT DEFAULT '', created_at TEXT DEFAULT CURRENT_TIMESTAMP ) """) connection.commit() connection.close()if name == "main": init_db() print(f"資料庫已建立:{DATABASE_PATH}")
步驟 2:理解資料表設計
這份程式碼最重要的部分是 CREATE TABLE。
SQL 定義 用途
id INTEGER PRIMARY KEY AUTOINCREMENT 自動產生唯一編號
title TEXT NOT NULL 名稱必須填寫
media_type 限制只能是電影或遊戲
year INTEGER 儲存年份
rating 評分只能是 1–10 或空值
created_at 記錄新增時間
CHECK 是資料庫層級的限制,即使未來不是透過網頁新增資料,也可以阻擋部分不合理的值。
sqlite3.Row 則讓查詢結果可以用 row["title"] 讀取,不必只靠數字索引。
步驟 3:建立資料庫檔案
在 VS Code 終端機輸入:
python database.py
成功後,專案中應該會多出:
my-media-library/
├── app.py
├── database.py
├── media.db
├── requirements.txt
├── templates/
└── static/
media.db 就是資料庫檔案。請不要手動建立同名的空白文字檔,應該讓 Python 自動產生。
步驟 4:檢查資料庫
建立一個暫時的測試檔 check_db.py:
from database import get_db_connectionconnection = get_db_connection()tables = connection.execute(""" SELECT name FROM sqlite_master WHERE type = 'table'""").fetchall()for table in tables: print(table["name"])connection.close()
執行:
python check_db.py
應該會看到 media 這個資料表。