Python sqlite3(Python SQLite3)
這篇 Python sqlite3 教學是實戰階段的第一篇:SQLite 是「一個檔案就是一個資料庫」的輕量資料庫,Python 內建支援、不用安裝任何東西,是練習 SQL 語法最方便的環境。本站 SQL 教學系列的語法,這篇全部可以動手實作。
連線與建立資料表
import sqlite3
conn = sqlite3.connect("school.db") # 檔案不存在會自動建立
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
score INTEGER
)
""")
conn.commit()
print("資料表建立完成")
執行輸出:
資料表建立完成
流程固定三步:connect() 連線 → cursor() 取得游標 → execute() 執行 SQL。CREATE TABLE 語法詳見 CREATE TABLE 教學。
新增資料:一定要用參數化查詢
# 單筆:值用 ? 佔位,資料以 tuple 傳入
cur.execute("INSERT INTO students (name, score) VALUES (?, ?)", ("小明", 85))
# 多筆:executemany
data = [("小華", 92), ("小美", 78)]
cur.executemany("INSERT INTO students (name, score) VALUES (?, ?)", data)
conn.commit() # 寫入類操作要 commit 才真正生效
print("已新增", cur.rowcount, "筆")
執行輸出:
已新增 2 筆
絕對不要用 f-string 把使用者輸入拼進 SQL——這就是 SQL Injection 漏洞的來源,? 參數化查詢才是唯一正解。INSERT 語法詳見 INSERT INTO 教學。
查詢資料
cur.execute("SELECT name, score FROM students WHERE score >= ?", (80,))
for name, score in cur.fetchall():
print(f"{name}:{score} 分")
執行輸出:
小明:85 分
小華:92 分
| 取結果方法 | 說明 |
|---|---|
fetchall() | 全部取回(List of tuples) |
fetchone() | 取一筆(或 None) |
| 直接迭代 cursor | 逐筆處理大量資料 |
SELECT 與 WHERE 的完整語法見 SQL SELECT 與 SQL WHERE。
更新、刪除與關閉連線
cur.execute("UPDATE students SET score = ? WHERE name = ?", (90, "小美"))
cur.execute("DELETE FROM students WHERE score < ?", (60,))
conn.commit()
conn.close() # 用完關閉連線
print("完成")
執行輸出:
完成
也可以用 with 自動管理交易(區塊成功自動 commit、出錯自動 rollback):
import sqlite3
with sqlite3.connect("school.db") as conn:
conn.execute("INSERT INTO students (name, score) VALUES (?, ?)", ("小強", 88))
# 離開 with 自動 commit
常見錯誤
1. 資料寫了卻不見:忘記 commit
INSERT/UPDATE/DELETE 後沒 conn.commit(),程式結束變更就消失。寫入類操作後必 commit,或用 with 區塊。
2. sqlite3.OperationalError: no such table
資料表不存在:連到了錯的 .db 檔(相對路徑問題),或 CREATE TABLE 沒執行過。建表語句加 IF NOT EXISTS 最保險。
3. 用字串拼接 SQL
能動,但等於把資料庫鑰匙交給使用者輸入。一律 ? 參數化,沒有例外。
總結
connect → cursor → execute → commit → close;查詢用 fetchall/fetchone、寫入記得 commit、參數一律用 ?。SQLite 適合練習與小工具,正式環境的 MySQL/PostgreSQL 連線方式,下一篇登場。
延伸閱讀
- Python 教學(系列目錄)
- SQL 教學(本站 SQL 系列)
- CREATE TABLE
- SQL SELECT
- Python 例外處理 (try except)
- Python 連線 MySQL / PostgreSQL(下一篇)