在Python中使用SQLite數(shù)據(jù)庫進(jìn)行增刪改查操作的代碼示例
一、核心前置知識
- Python 內(nèi)置
sqlite3模塊,無需pip install,直接導(dǎo)入即可使用。 - 操作流程:
建立連接 → 創(chuàng)建游標(biāo) → 執(zhí)行SQL → 處理結(jié)果 → 提交事務(wù)(增刪改)→ 關(guān)閉資源。 - 占位符:SQLite 使用
?作為參數(shù)占位符(避免 SQL 注入,切勿字符串拼接)。
二、完整 CRUD 示例
步驟1:導(dǎo)入模塊并建立連接
import sqlite3
# 1. 建立連接(關(guān)鍵)
# - 連接本地文件:test.db(不存在則自動創(chuàng)建)
# - 內(nèi)存數(shù)據(jù)庫:sqlite3.connect(":memory:")(程序退出后數(shù)據(jù)丟失)
conn = sqlite3.connect("test.db")
# 2. 創(chuàng)建游標(biāo)(執(zhí)行SQL的工具)
cursor = conn.cursor()
步驟2:創(chuàng)建表(基礎(chǔ)準(zhǔn)備)
先定義數(shù)據(jù)表結(jié)構(gòu)(以 users 表為例,包含 id、姓名、年齡、郵箱):
# 創(chuàng)建users表(IF NOT EXISTS 避免重復(fù)創(chuàng)建)
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自增主鍵
name TEXT NOT NULL, -- 姓名(非空)
age INTEGER, -- 年齡
email TEXT UNIQUE -- 郵箱(唯一,避免重復(fù))
);
"""
cursor.execute(create_table_sql)
conn.commit() # 建表屬于修改操作,需提交事務(wù)
步驟3:新增數(shù)據(jù)(CREATE)
支持單條插入和批量插入,核心是用 ? 占位符傳遞參數(shù):
# 方式1:單條插入
insert_single_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
# 參數(shù)以元組形式傳遞,匹配占位符數(shù)量
cursor.execute(insert_single_sql, ("Alice", 25, "alice@example.com"))
# 方式2:批量插入(效率更高,減少IO)
insert_batch_sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?);"
data_list = [
("Bob", 30, "bob@example.com"),
("Charlie", 28, "charlie@example.com"),
("David", 22, "david@example.com")
]
cursor.executemany(insert_batch_sql, data_list)
# 增刪改操作必須提交事務(wù),否則數(shù)據(jù)不生效
conn.commit()
print("插入數(shù)據(jù)成功,最后插入的ID:", cursor.lastrowid) # 獲取最后插入的主鍵ID
步驟4:查詢數(shù)據(jù)(READ)
查詢無需提交事務(wù),核心是通過 fetchone()/fetchall()/fetchmany(n) 獲取結(jié)果:
# 方式1:查詢單條數(shù)據(jù)(fetchone())
select_single_sql = "SELECT * FROM users WHERE name = ?;"
cursor.execute(select_single_sql, ("Alice",))
single_result = cursor.fetchone() # 返回元組:(1, 'Alice', 25, 'alice@example.com')
print("單條查詢結(jié)果:", single_result)
# 方式2:查詢多條數(shù)據(jù)(fetchall())
select_all_sql = "SELECT id, name, age FROM users WHERE age > ?;"
cursor.execute(select_all_sql, (25,))
all_results = cursor.fetchall() # 返回列表嵌套元組:[(2, 'Bob', 30), (3, 'Charlie', 28)]
print("\n多條查詢結(jié)果:")
for row in all_results:
print(f"ID: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}")
# 方式3:指定條數(shù)查詢(fetchmany(n))
cursor.execute("SELECT * FROM users;")
many_results = cursor.fetchmany(2) # 僅獲取前2條
print("\n指定條數(shù)查詢結(jié)果:", many_results)
# 進(jìn)階:返回字典格式結(jié)果(更易讀)
# 創(chuàng)建游標(biāo)時指定 row_factory
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?;", (1,))
dict_result = cursor.fetchone()
print("\n字典格式結(jié)果:", dict_result["name"], dict_result["email"]) # 可通過鍵取值
步驟5:更新數(shù)據(jù)(UPDATE)
根據(jù)條件修改已有數(shù)據(jù),注意加 WHERE 子句(否則會更新全表):
update_sql = "UPDATE users SET age = ? WHERE name = ?;"
cursor.execute(update_sql, (26, "Alice")) # 將Alice的年齡改為26
conn.commit()
# 查看受影響的行數(shù)
print("更新影響的行數(shù):", cursor.rowcount) # 輸出:1
步驟6:刪除數(shù)據(jù)(DELETE)
同樣需加 WHERE 子句(否則刪除全表數(shù)據(jù)):
delete_sql = "DELETE FROM users WHERE id = ?;"
cursor.execute(delete_sql, (4,)) # 刪除ID為4的記錄
conn.commit()
print("刪除影響的行數(shù):", cursor.rowcount) # 輸出:1
步驟7:關(guān)閉資源(避免泄漏)
# 先關(guān)游標(biāo),再關(guān)連接 cursor.close() conn.close()
三、最佳實踐
1. 使用上下文管理器(with 語句)
自動關(guān)閉游標(biāo)/連接,無需手動 close,更簡潔安全:
import sqlite3
# 上下文管理器簡化操作
with sqlite3.connect("test.db") as conn:
cursor = conn.cursor()
# 執(zhí)行查詢
cursor.execute("SELECT * FROM users;")
print("上下文管理器查詢結(jié)果:", cursor.fetchall())
# 增刪改無需手動commit,with塊結(jié)束會自動提交(出錯則回滾)
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Eve", 29, "eve@example.com"))
2. 防 SQL 注入(關(guān)鍵)
嚴(yán)禁字符串拼接 SQL,必須使用 ? 占位符:
# 錯誤示例(易被注入,如name傳入 "Alice'; DROP TABLE users; --")
name = "Alice"
sql = f"SELECT * FROM users WHERE name = '{name}';" # 危險!
# 正確示例(占位符)
sql = "SELECT * FROM users WHERE name = ?;"
cursor.execute(sql, (name,)) # 安全
3. 處理異常(生產(chǎn)環(huán)境必備)
捕獲 sqlite3.Error 異常,避免程序崩潰:
import sqlite3
try:
conn = sqlite3.connect("test.db")
cursor = conn.cursor()
# 執(zhí)行可能出錯的操作(如插入重復(fù)郵箱)
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Frank", 35, "alice@example.com"))
conn.commit()
except sqlite3.IntegrityError as e:
# 捕獲唯一鍵沖突異常
print("插入失?。何ㄒ绘I沖突", e)
conn.rollback() # 出錯回滾事務(wù)
except sqlite3.Error as e:
print("數(shù)據(jù)庫錯誤:", e)
conn.rollback()
finally:
if cursor:
cursor.close()
if conn:
conn.close()
四、常見問題解答
- 建表后數(shù)據(jù)不生效?
增刪改/建表操作需執(zhí)行conn.commit(),查詢無需。 - 自增主鍵如何獲取?
插入后通過cursor.lastrowid獲取最后插入的 ID。 - 如何返回字典格式結(jié)果?
設(shè)置conn.row_factory = sqlite3.Row,游標(biāo)結(jié)果可通過鍵取值。 - 內(nèi)存數(shù)據(jù)庫的用途?
sqlite3.connect(":memory:")適合臨時測試,數(shù)據(jù)僅存于內(nèi)存,程序退出后丟失。
總結(jié)
SQLite 操作的核心是:
- 連接:
sqlite3.connect()(文件/內(nèi)存); - 執(zhí)行:
cursor.execute()(單條)/executemany()(批量); - 參數(shù):用
?占位符,避免 SQL 注入; - 事務(wù):增刪改需
commit(),異常需rollback(); - 資源:用
with語句或手動關(guān)閉游標(biāo)/連接。
掌握以上內(nèi)容,即可滿足 Python 中 SQLite 絕大部分基礎(chǔ)使用場景。
以上就是在Python中使用SQLite數(shù)據(jù)庫進(jìn)行增刪改查操作的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Python使用SQLite增刪改查的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python列表操作之extend和append的區(qū)別實例分析
這篇文章主要介紹了python列表操作之extend和append的區(qū)別,實例分析了extend方法和append方法使用上的區(qū)別,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
conda管理Python虛擬環(huán)境的實現(xiàn)
本文主要介紹了conda管理Python虛擬環(huán)境的實現(xiàn),主要包括使用conda工具創(chuàng)建、查看和刪除Python虛擬環(huán)境,具有一定的參考價值,感興趣的可以了解一下2024-01-01
python完成FizzBuzzWhizz問題(拉勾網(wǎng)面試題)示例
這篇文章主要介紹了python完成FizzBuzzWhizz問題(拉勾網(wǎng)面試題)示例,需要的朋友可以參考下2014-05-05
Python中enumerate函數(shù)及其應(yīng)用詳解
在 Python 編程中,enumerate 函數(shù)是一個非常實用的工具,它能夠?qū)⒁粋€可迭代對象組合為一個索引序列,同時列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),這種功能在處理列表、元組、字符串等可迭代對象時非常有用,尤其是在需要同時獲取每個元素的索引和值的情況下,需要的朋友可以參考下2025-01-01
PyQt5中QCommandLinkButton的詳細(xì)教程與應(yīng)用實戰(zhàn)
在PyQt5中,QCommandLinkButton是一個特殊的按鈕控件,它最初在Windows Vista中引入,并因其獨特的外觀和功能在GUI應(yīng)用程序中得到了廣泛應(yīng)用,本教程將結(jié)合實際案例,詳細(xì)介紹QCommandLinkButton在PyQt5中的用法,需要的朋友可以參考下2024-07-07

