在Python中使用SQLite數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作的代碼示例
一、核心前置知識(shí)
- Python 內(nèi)置
sqlite3模塊,無(wú)需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(不存在則自動(dòng)創(chuàng)建)
# - 內(nèi)存數(shù)據(jù)庫(kù):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:?jiǎn)螚l插入
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ú)需提交事務(wù),核心是通過(guò) 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)時(shí)指定 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"]) # 可通過(guò)鍵取值
步驟5:更新數(shù)據(jù)(UPDATE)
根據(jù)條件修改已有數(shù)據(jù),注意加 WHERE 子句(否則會(huì)更新全表):
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()
三、最佳實(shí)踐
1. 使用上下文管理器(with 語(yǔ)句)
自動(dòng)關(guān)閉游標(biāo)/連接,無(wú)需手動(dòng) close,更簡(jiǎn)潔安全:
import sqlite3
# 上下文管理器簡(jiǎn)化操作
with sqlite3.connect("test.db") as conn:
cursor = conn.cursor()
# 執(zhí)行查詢
cursor.execute("SELECT * FROM users;")
print("上下文管理器查詢結(jié)果:", cursor.fetchall())
# 增刪改無(wú)需手動(dòng)commit,with塊結(jié)束會(huì)自動(dòng)提交(出錯(cuò)則回滾)
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?);", ("Eve", 29, "eve@example.com"))
2. 防 SQL 注入(關(guān)鍵)
嚴(yán)禁字符串拼接 SQL,必須使用 ? 占位符:
# 錯(cuò)誤示例(易被注入,如name傳入 "Alice'; DROP TABLE users; --")
name = "Alice"
sql = f"SELECT * FROM users WHERE name = '{name}';" # 危險(xiǎn)!
# 正確示例(占位符)
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í)行可能出錯(cuò)的操作(如插入重復(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() # 出錯(cuò)回滾事務(wù)
except sqlite3.Error as e:
print("數(shù)據(jù)庫(kù)錯(cuò)誤:", e)
conn.rollback()
finally:
if cursor:
cursor.close()
if conn:
conn.close()
四、常見(jiàn)問(wèn)題解答
- 建表后數(shù)據(jù)不生效?
增刪改/建表操作需執(zhí)行conn.commit(),查詢無(wú)需。 - 自增主鍵如何獲???
插入后通過(guò)cursor.lastrowid獲取最后插入的 ID。 - 如何返回字典格式結(jié)果?
設(shè)置conn.row_factory = sqlite3.Row,游標(biāo)結(jié)果可通過(guò)鍵取值。 - 內(nèi)存數(shù)據(jù)庫(kù)的用途?
sqlite3.connect(":memory:")適合臨時(shí)測(cè)試,數(shù)據(jù)僅存于內(nèi)存,程序退出后丟失。
總結(jié)
SQLite 操作的核心是:
- 連接:
sqlite3.connect()(文件/內(nèi)存); - 執(zhí)行:
cursor.execute()(單條)/executemany()(批量); - 參數(shù):用
?占位符,避免 SQL 注入; - 事務(wù):增刪改需
commit(),異常需rollback(); - 資源:用
with語(yǔ)句或手動(dòng)關(guān)閉游標(biāo)/連接。
掌握以上內(nèi)容,即可滿足 Python 中 SQLite 絕大部分基礎(chǔ)使用場(chǎng)景。
以上就是在Python中使用SQLite數(shù)據(jù)庫(kù)進(jìn)行增刪改查操作的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Python使用SQLite增刪改查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python連接數(shù)據(jù)庫(kù)的3種方法對(duì)比(SQLite\MySQL\PostgreSQL)
- python連接sqlite3簡(jiǎn)單用法完整例子
- Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)詳解
- 利用Python連接MySQL超詳細(xì)實(shí)戰(zhàn)教程
- Python進(jìn)行SQLite和MySQL數(shù)據(jù)庫(kù)連接與操作的完整指南
- Python進(jìn)行PostgreSQL數(shù)據(jù)庫(kù)連接的詳細(xì)使用指南
- 使用python進(jìn)行PostgreSQL數(shù)據(jù)庫(kù)連接全過(guò)程
- Python連接PostgreSQL數(shù)據(jù)庫(kù)并查詢數(shù)據(jù)的詳細(xì)指南
- Python連接到PostgreSQL數(shù)據(jù)庫(kù)的方法詳解
- Python數(shù)據(jù)庫(kù)學(xué)習(xí)心得:SQLite、MySQL、PostgreSQL優(yōu)缺點(diǎn)
相關(guān)文章
K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn)
這篇文章主要介紹了K近鄰法(KNN)相關(guān)知識(shí)總結(jié)以及如何用python實(shí)現(xiàn),幫助大家更好的利用python實(shí)現(xiàn)機(jī)器學(xué)習(xí),感興趣的朋友可以了解下2021-01-01
如何利用Python實(shí)現(xiàn)給Excel表格截圖
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)給Excel表格截圖功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
python機(jī)器學(xué)習(xí)實(shí)現(xiàn)oneR算法(以鳶尾data為例)
本文主要介紹了python機(jī)器學(xué)習(xí)實(shí)現(xiàn)oneR算法(以鳶尾data為例),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式
這篇文章主要介紹了Pytorch實(shí)現(xiàn)將label變成one hot編碼的兩種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作示例
這篇文章主要介紹了Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作,結(jié)合具體實(shí)例形式分析了Python針對(duì)糗事百科的抓取與Excel文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
用Python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼)
這篇文章主要介紹了用Python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)(附代碼),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

