十分想念順店雜可。。。
Python 的sqlite3
模塊是標準庫中用于操作SQLite 數據庫的工具。SQLite 是一款輕量級嵌入式數據庫(無需獨立服務器,數據存儲在單一文件中),適合小型應用、本地數據存儲或原型開發。sqlite3
模塊提供了完整的 SQLite 操作接口,支持標準 SQL 語法。
一、核心概念
- 數據庫文件:SQLite 數據存儲在單一文件中(如
data.db
),無需單獨部署服務器。 - 連接(Connection):通過
sqlite3.connect()
創建與數據庫文件的連接。 - 游標(Cursor):通過連接獲取游標對象,用于執行 SQL 語句和獲取結果。
- 事務:默認自動提交(
autocommit=False
時需手動提交),支持commit()
提交和rollback()
回滾。
二、基本用法
1. 連接數據庫
使用sqlite3.connect()
創建連接,若指定文件不存在則自動創建。
import sqlite3# 連接數據庫(文件不存在則創建)
conn = sqlite3.connect('test.db') # 數據庫文件名為test.db# 獲取游標(用于執行SQL語句)
cursor = conn.cursor()
2. 創建表(CREATE TABLE)
通過游標執行CREATE TABLE
語句創建表,需指定表名和字段(SQLite 支持動態類型,常用類型:INTEGER
、TEXT
、REAL
、BLOB
)。
# 創建用戶表(id為主鍵自增,name為文本,age為整數)
create_sql = '''
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,email TEXT UNIQUE # email唯一
)
'''
cursor.execute(create_sql)# 提交事務(創建表屬于 schema 變更,需提交)
conn.commit()
IF NOT EXISTS
:避免表已存在時報錯。PRIMARY KEY AUTOINCREMENT
:id 字段自動增長,作為唯一標識。
3. 插入數據(INSERT)
使用INSERT
語句插入數據,推薦用參數化查詢(?
作為占位符),避免 SQL 注入。
# 插入單條數據
insert_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)"
cursor.execute(insert_sql, ('Alice', 25, 'alice@example.com')) # 參數以元組傳入# 插入多條數據( executemany 批量插入)
users = [('Bob', 30, 'bob@example.com'),('Charlie', 35, 'charlie@example.com')
]
cursor.executemany(insert_sql, users) # 第二個參數為可迭代對象# 提交事務(插入/更新/刪除操作需提交才生效)
conn.commit()
4. 查詢數據(SELECT)
通過SELECT
語句查詢數據,使用fetchone()
、fetchmany(n)
、fetchall()
獲取結果。
# 1. 查詢所有數據
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall() # 獲取所有結果(列表嵌套元組)
print("所有用戶:", all_users)
# 輸出:[(1, 'Alice', 25, 'alice@example.com'), (2, 'Bob', 30, 'bob@example.com'), ...]# 2. 查詢單條數據(按條件)
cursor.execute("SELECT name, age FROM users WHERE age > ?", (28,))
user = cursor.fetchone() # 獲取第一條結果(元組)
print("年齡>28的第一個用戶:", user) # 輸出:('Bob', 30)# 3. 查詢部分數據(限制條數)
cursor.execute("SELECT * FROM users ORDER BY age DESC")
top2 = cursor.fetchmany(2) # 獲取前2條結果
print("年齡最大的2個用戶:", top2)
5. 更新數據(UPDATE)
使用UPDATE
語句修改數據,同樣支持參數化查詢。
# 更新Alice的年齡為26
update_sql = "UPDATE users SET age = ? WHERE name = ?"
cursor.execute(update_sql, (26, 'Alice'))
conn.commit() # 提交修改# 驗證更新結果
cursor.execute("SELECT age FROM users WHERE name = 'Alice'")
print("Alice的新年齡:", cursor.fetchone()[0]) # 輸出:26
6. 刪除數據(DELETE)
使用DELETE
語句刪除數據,注意條件判斷避免誤刪。
# 刪除郵箱為charlie@example.com的用戶
delete_sql = "DELETE FROM users WHERE email = ?"
cursor.execute(delete_sql, ('charlie@example.com',))
conn.commit()# 驗證刪除結果
cursor.execute("SELECT * FROM users WHERE email = 'charlie@example.com'")
print("刪除后是否存在:", cursor.fetchone()) # 輸出:None(表示不存在)
7. 關閉連接
操作完成后,需關閉游標和連接釋放資源。
# 關閉游標
cursor.close()# 關閉連接
conn.close()
三、高級特性
1. 事務處理
SQLite 默認開啟事務(autocommit=False
),多個操作需手動commit()
提交;若中間出錯,可rollback()
回滾。
try:# 開啟事務(默認已開啟)cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Dave', 40))cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Eve', '30')) # 錯誤:age應為整數# 若全部成功,提交事務conn.commit()
except sqlite3.Error as e:# 出錯時回滾(撤銷所有未提交操作)conn.rollback()print(f"事務失敗,已回滾:{e}")
finally:cursor.close()conn.close()
2. 上下文管理器(with 語句)
使用with
語句自動管理連接和游標,無需手動關閉。
# 連接作為上下文管理器:自動提交或回滾(出錯時)
with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor: # 游標作為上下文管理器# 執行查詢cursor.execute("SELECT name FROM users")print("用戶列表:", [row[0] for row in cursor.fetchall()])
# 退出with塊后,連接和游標自動關閉
3. 行工廠(Row Factory)
設置conn.row_factory = sqlite3.Row
,使查詢結果可通過字段名訪問(類似字典)。
conn = sqlite3.connect('test.db')
conn.row_factory = sqlite3.Row # 啟用行工廠
cursor = conn.cursor()cursor.execute("SELECT * FROM users WHERE name = 'Alice'")
user = cursor.fetchone()# 可通過索引或字段名訪問
print("ID:", user[0]) # 索引訪問
print("姓名:", user['name']) # 字段名訪問(更直觀)
print("年齡:", user['age'])cursor.close()
conn.close()
4. 執行 SQL 腳本
通過executescript()
執行多條 SQL 語句(以分號分隔)。
with sqlite3.connect('test.db') as conn:with conn.cursor() as cursor:# 執行批量SQL(創建表+插入數據)script = '''CREATE TABLE IF NOT EXISTS products (id INTEGER PRIMARY KEY, name TEXT);INSERT INTO products (name) VALUES ('Laptop');INSERT INTO products (name) VALUES ('Phone');'''cursor.executescript(script)conn.commit()
四、常見錯誤與注意事項
SQL 注入風險:
禁止用字符串拼接構造 SQL(如f"INSERT INTO users VALUES ({name})"
),必須用參數化查詢(?
占位符)。數據類型:
SQLite 是動態類型,字段類型聲明僅為建議(如INTEGER
字段可存入字符串),需在應用層保證類型正確。并發寫入:
SQLite 適合單線程或低并發場景,高并發寫入可能導致鎖表(同一時間僅允許一個寫操作)。事務未提交:
插入 / 更新 / 刪除后未調用commit()
,數據不會寫入數據庫(僅在內存中臨時存在)。表已存在:
創建表時添加IF NOT EXISTS
,避免table already exists
錯誤。
五、適用場景
- 小型應用或工具(如本地配置存儲、日志記錄);
- 原型開發(快速搭建,無需部署數據庫服務器);
- 嵌入式設備(資源有限,無需獨立數據庫進程);
- 測試環境(輕量、易部署)。
總結
sqlite3
模塊提供了簡潔的接口操作 SQLite 數據庫,核心流程為:
連接數據庫 → 獲取游標 → 執行 SQL → 處理結果 → 提交事務 → 關閉連接。
通過參數化查詢、事務管理和上下文管理器,可安全高效地實現本地數據存儲,是輕量級場景的理想選擇。