Python sqlite3 資料庫操作

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 SELECTSQL 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

能動,但等於把資料庫鑰匙交給使用者輸入。一律 ? 參數化,沒有例外。

總結

connectcursorexecutecommitclose;查詢用 fetchall/fetchone、寫入記得 commit、參數一律用 ?。SQLite 適合練習與小工具,正式環境的 MySQL/PostgreSQL 連線方式,下一篇登場。

延伸閱讀