跳轉至

建立 2025-02-12 更新 2026-10-03

SQLite SQLite 使用簡介

SQLite 是一個輕量級的嵌入式關聯式資料庫,整個資料庫就是一個檔案,不需要安裝或啟動伺服器。Python 內建 sqlite3 模組,可以直接建立與操作 SQLite 資料庫,因此非常適合學習 SQL、桌面或手機 App、小型網站與資料分析。本頁介紹 SQLite 的特性,以及用 Python 進行連線、建表、新增、查詢、更新、刪除的完整流程。

SQLite 的特性與適用情境

  • 零設定:沒有帳號密碼、沒有埠號,連線時給檔名即可。
  • 單一檔案:備份或分享資料庫只要複製一個 .db 檔。
  • 部署量最大:每支 Android/iOS 手機、Chrome、Firefox 都內建 SQLite。
  • 限制:同一時間只能有一個寫入者,不適合大量使用者同時寫入的網站後端;這種情境請改用 PostgreSQL 或 MySQL。

命令列工具 sqlite3

macOS 與多數 Linux 已內建 sqlite3 命令列工具;Windows 可從 SQLite 官網下載頁 取得。

sqlite3 example.db        # 開啟(或建立)資料庫檔案
.tables                   -- 列出所有資料表
.schema users             -- 查看資料表結構
.headers on               -- 查詢結果顯示欄位名稱
.mode column              -- 以欄位對齊方式顯示
.quit                     -- 離開

以 . 開頭的是 sqlite3 工具的指令,其餘輸入則當成 SQL 執行(記得以 ; 結尾)。

1. 連接到 SQLite 資料庫

連線時若資料庫檔案不存在,SQLite 會自動建立一個新的檔案。

import sqlite3

# 連接到 SQLite 資料庫,如果資料庫不存在則會自動創建
conn = sqlite3.connect('example.db')

# 創建一個 cursor 物件,通過它來執行 SQL 語句
cursor = conn.cursor()

記憶體資料庫

sqlite3.connect(':memory:') 會建立只存在記憶體中的資料庫,程式結束就消失,很適合寫測試或臨時練習。

2. 創建表格

使用 cursor.execute() 執行 SQL 語句。下面建立一個名為 users 的表格:

cursor.execute('''
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,
        age INTEGER NOT NULL
    )
''')

# 保存 (commit) 變更
conn.commit()

IF NOT EXISTS 讓程式重複執行時不會因為表格已存在而出錯。

3. 插入數據

使用 INSERT INTO 語句插入數據,資料以 ? 佔位符傳入:

# 插入一條數據
cursor.execute('''
    INSERT INTO users (name, age)
    VALUES (?, ?)
''', ('Alice', 30))

# 插入多條數據
users = [
    ('Bob', 24),
    ('Charlie', 29)
]
cursor.executemany('''
    INSERT INTO users (name, age)
    VALUES (?, ?)
''', users)

# 保存變更
conn.commit()
print(cursor.lastrowid)  # 最後一筆新增資料的 id

不要用字串拼接 SQL

f"... WHERE name = '{name}'" 這種寫法會造成 SQL 注入(SQL Injection)漏洞,攻擊者可以透過輸入內容竄改你的 SQL。請一律使用 ? 佔位符,詳見 Python DB-API。

4. 查詢數據

cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()       # 取得全部結果(list of tuple)

for row in rows:
    print(row)

cursor.execute('SELECT * FROM users WHERE id = ?', (1,))
print(cursor.fetchone())       # 只取一筆,沒有資料時回傳 None

想用欄位名稱取值,可設定 row_factory:

conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
for row in cursor:
    print(row['name'], row['age'])

5. 更新數據

cursor.execute('''
    UPDATE users
    SET age = ?
    WHERE name = ?
''', (32, 'Alice'))

conn.commit()
print(cursor.rowcount)  # 受影響的資料筆數

6. 刪除數據

cursor.execute('''
    DELETE FROM users
    WHERE name = ?
''', ('Bob',))

conn.commit()

注意 ('Bob',) 結尾的逗號:只有一個參數時,也必須傳入 tuple。

7. 關閉連接

完成操作後,請務必關閉 cursor 和資料庫連接:

cursor.close()
conn.close()

建議寫法:用 with 自動處理交易

sqlite3 的連線物件可以搭配 with 使用:區塊正常結束時自動 commit,發生例外時自動 rollback。要注意的是 with 不會關閉連線,可再搭配 contextlib.closing:

import sqlite3
from contextlib import closing

with closing(sqlite3.connect('example.db')) as conn:
    with conn:  # 交易:成功自動 commit,失敗自動 rollback
        conn.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Dora', 27))

    for row in conn.execute('SELECT name, age FROM users ORDER BY age'):
        print(row)

連線物件本身也有 execute(),簡單情境不必另外建立 cursor。

推薦影音

Python SQLite Tutorial: Complete Overview(Corey Schafer)

簡述:Corey Schafer 以約 30 分鐘示範 sqlite3 的建表、新增、查詢、參數化查詢與 with 寫法,講解細膩、正確,是學 Python 操作 SQLite 的首選影片,與本頁內容完全對應。

SQLite Databases With Python - Full Course(freeCodeCamp)

簡述:約 1 小時的實作課程,從建立資料庫一路做到查詢、更新、刪除與把程式碼整理成函式,適合想多看幾個完整範例的初學者。

D. Richard Hipp - SQLite(CMU Database Group)

簡述:SQLite 作者 Richard Hipp 在卡內基美隆大學(CMU)的演講,說明 SQLite 的設計理念、內部架構與適用場景,適合想了解「SQLite 為什麼這樣設計」的進階讀者。

相關資料