SQLite 使用簡介
SQLite 是一個輕量級的嵌入式關聯式資料庫,整個資料庫就是一個檔案,不需要安裝或啟動伺服器。Python 內建 sqlite3 模組,可以直接建立與操作 SQLite 資料庫,因此非常適合學習 SQL、桌面或手機 App、小型網站與資料分析。本頁介紹 SQLite 的特性,以及用 Python 進行連線、建表、新增、查詢、更新、刪除的完整流程。
SQLite 的特性與適用情境
- 零設定:沒有帳號密碼、沒有埠號,連線時給檔名即可。
- 單一檔案:備份或分享資料庫只要複製一個
.db檔。 - 部署量最大:每支 Android/iOS 手機、Chrome、Firefox 都內建 SQLite。
- 限制:同一時間只能有一個寫入者,不適合大量使用者同時寫入的網站後端;這種情境請改用 PostgreSQL 或 MySQL。
命令列工具 sqlite3
macOS 與多數 Linux 已內建 sqlite3 命令列工具;Windows 可從 SQLite 官網下載頁 取得。
.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. 刪除數據
注意 ('Bob',) 結尾的逗號:只有一個參數時,也必須傳入 tuple。
7. 關閉連接
完成操作後,請務必關閉 cursor 和資料庫連接:
建議寫法:用 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 為什麼這樣設計」的進階讀者。