Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)詳解
前言
在 Python 開發(fā)中,SQLite 是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù),它無(wú)需單獨(dú)安裝數(shù)據(jù)庫(kù)服務(wù)器,所有數(shù)據(jù)存儲(chǔ)在一個(gè)單獨(dú)的文件中,適用于小型應(yīng)用、移動(dòng)開發(fā)、數(shù)據(jù)分析等場(chǎng)景。Python 提供了內(nèi)置的 sqlite3 模塊,方便我們操作 SQLite 數(shù)據(jù)庫(kù)。本文將詳細(xì)介紹 sqlite3 模塊的使用,包括數(shù)據(jù)庫(kù)連接、表操作、數(shù)據(jù)增刪改查(CRUD),以及常見(jiàn)的事務(wù)管理和參數(shù)化查詢,幫助你快速掌握 Python 操作 SQLite 數(shù)據(jù)庫(kù)的方法。
1. 為什么選擇 SQLite?
? 零配置:Python 內(nèi)置支持,無(wú)需安裝額外數(shù)據(jù)庫(kù)服務(wù)。
? 文件存儲(chǔ):數(shù)據(jù)庫(kù)僅是一個(gè) .db 文件,便于管理。
? 輕量高效:適用于小型應(yīng)用、測(cè)試環(huán)境、移動(dòng)端存儲(chǔ)。
? SQL 支持:支持 SQL 語(yǔ)法,易于與其他數(shù)據(jù)庫(kù)遷移。
?? SQLite 適用場(chǎng)景:
- 桌面應(yīng)用(如瀏覽器、記事本應(yīng)用存儲(chǔ)用戶數(shù)據(jù))。
- 移動(dòng)應(yīng)用(Android、iOS 本地?cái)?shù)據(jù)庫(kù))。
- 數(shù)據(jù)分析(存儲(chǔ)小型數(shù)據(jù)集,替代 CSV 文件)。
2. 連接 SQLite 數(shù)據(jù)庫(kù)
2.1 連接或創(chuàng)建數(shù)據(jù)庫(kù)
使用 sqlite3.connect() 連接數(shù)據(jù)庫(kù):
import sqlite3
# 連接數(shù)據(jù)庫(kù)(如果不存在則創(chuàng)建)
conn = sqlite3.connect("example.db")
print("數(shù)據(jù)庫(kù)連接成功")
?? 特點(diǎn):
- 如果
example.db存在,則連接它,否則自動(dòng)創(chuàng)建該文件。
2.2 獲取游標(biāo)(Cursor)
數(shù)據(jù)庫(kù)操作需要使用 游標(biāo)對(duì)象(cursor):
cursor = conn.cursor()
?? 作用:
cursor.execute(sql)用于執(zhí)行 SQL 語(yǔ)句。cursor.fetchall()獲取查詢結(jié)果。
3. 創(chuàng)建表(CREATE TABLE)
使用 CREATE TABLE 語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)表:
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
city TEXT
)
''')
conn.commit() # 提交更改
print("表創(chuàng)建成功")
?? 解析:
id INTEGER PRIMARY KEY AUTOINCREMENT:主鍵自增。TEXT NOT NULL:name必須有值。IF NOT EXISTS:避免重復(fù)創(chuàng)建表。
4. 插入數(shù)據(jù)(INSERT INTO)
4.1 插入單條數(shù)據(jù)
cursor.execute("INSERT INTO users (name, age, city) VALUES (?, ?, ?)",
("Alice", 25, "New York"))
conn.commit()
print("插入數(shù)據(jù)成功")
?? 注意:
?占位符 避免 SQL 注入。conn.commit()提交事務(wù),否則數(shù)據(jù)不會(huì)保存。
4.2 插入多條數(shù)據(jù)(executemany())
users = [
("Bob", 30, "San Francisco"),
("Charlie", 28, "Los Angeles"),
("David", 35, "Seattle")
]
cursor.executemany("INSERT INTO users (name, age, city) VALUES (?, ?, ?)", users)
conn.commit()
print("批量插入成功")
?? 適用于:
- 批量寫入數(shù)據(jù),避免多次
execute()提高效率。
5. 查詢數(shù)據(jù)(SELECT)
5.1 查詢所有數(shù)據(jù)
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
?? fetchall() 獲取所有數(shù)據(jù),返回列表:
(1, 'Alice', 25, 'New York') (2, 'Bob', 30, 'San Francisco') (3, 'Charlie', 28, 'Los Angeles')
5.2 查詢單條數(shù)據(jù)(fetchone())
cursor.execute("SELECT * FROM users WHERE name = ?", ("Alice",))
user = cursor.fetchone()
print(user)
?? fetchone() 獲取單條數(shù)據(jù),適用于查詢唯一記錄。
6. 更新數(shù)據(jù)(UPDATE)
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, "Alice"))
conn.commit()
print("數(shù)據(jù)更新成功")
?? 確保:
SET age = ?只更新age列,避免誤修改其他數(shù)據(jù)。
7. 刪除數(shù)據(jù)(DELETE)
cursor.execute("DELETE FROM users WHERE name = ?", ("David",))
conn.commit()
print("數(shù)據(jù)刪除成功")
?? 務(wù)必小心:
- 沒(méi)有 WHERE 條件會(huì)刪除所有數(shù)據(jù)!
- 先
SELECT確認(rèn)數(shù)據(jù)是否存在。
8. 事務(wù)管理(commit() 和 rollback())
8.1 commit() 提交事務(wù)
conn.commit() # 確保數(shù)據(jù)寫入數(shù)據(jù)庫(kù)
?? 每次 INSERT、UPDATE、DELETE 后,都要 commit() 確保數(shù)據(jù)持久化。
8.2 rollback() 回滾事務(wù)
try:
cursor.execute("UPDATE users SET age = ? WHERE name = ?", (100, "Charlie"))
raise Exception("模擬異常") # 模擬錯(cuò)誤
conn.commit()
except Exception as e:
conn.rollback() # 發(fā)生錯(cuò)誤時(shí)回滾
print("事務(wù)回滾:", e)
?? 作用:
- 如果操作失敗,回滾到上一次
commit(),防止錯(cuò)誤影響數(shù)據(jù)庫(kù)。
9. 關(guān)閉數(shù)據(jù)庫(kù)連接
cursor.close()
conn.close()
print("數(shù)據(jù)庫(kù)連接已關(guān)閉")
?? 最佳實(shí)踐:
- 完成所有數(shù)據(jù)庫(kù)操作后,應(yīng)關(guān)閉連接,釋放資源。
10. 結(jié)合 with 語(yǔ)句自動(dòng)管理連接
Python 提供 with 語(yǔ)法,自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接:
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
?? 優(yōu)勢(shì):
- 自動(dòng) commit()
- 異常發(fā)生時(shí)自動(dòng) rollback()
- 退出時(shí)自動(dòng)關(guān)閉 conn
11. 使用 Row 以字典方式訪問(wèn)數(shù)據(jù)
默認(rèn) fetchall() 返回元組:
cursor.execute("SELECT * FROM users")
print(cursor.fetchone()) # (1, 'Alice', 25, 'New York')
可以改用 sqlite3.Row 使數(shù)據(jù)可用字典訪問(wèn):
conn.row_factory = sqlite3.Row # 設(shè)置行工廠
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
print(row["name"], row["age"]) # Alice 25
?? 適用于:
- 提高可讀性,避免
row[0]這樣的索引訪問(wèn)方式。
12. 結(jié)論
| 操作 | 代碼示例 |
|---|---|
| 連接數(shù)據(jù)庫(kù) | conn = sqlite3.connect("example.db") |
| 創(chuàng)建表 | CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER) |
| 插入數(shù)據(jù) | INSERT INTO users (name, age) VALUES (?, ?) |
| 查詢數(shù)據(jù) | SELECT * FROM users |
| 更新數(shù)據(jù) | UPDATE users SET age = ? WHERE name = ? |
| 刪除數(shù)據(jù) | DELETE FROM users WHERE name = ? |
| 事務(wù)管理 | commit() / rollback() |
| 關(guān)閉連接 | conn.close() |
sqlite3 是 Python 內(nèi)置的數(shù)據(jù)庫(kù)模塊,適用于小型應(yīng)用、測(cè)試、數(shù)據(jù)存儲(chǔ)等場(chǎng)景。掌握這些操作,你就可以輕松管理 SQLite 數(shù)據(jù)庫(kù),提升開發(fā)效率!
總結(jié)
到此這篇關(guān)于Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)Python sqlite3操作SQLite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用Python連接SQLite數(shù)據(jù)庫(kù)的操作步驟
- 通過(guò)python封裝SQLite3的示例代碼
- Python數(shù)據(jù)庫(kù)編程之SQLite和MySQL的實(shí)踐指南
- Python的sqlite3模塊中常用函數(shù)
- Python中SQLite數(shù)據(jù)庫(kù)的使用
- Python數(shù)據(jù)庫(kù)sqlite3圖文實(shí)例詳解
- Python使用sqlite3第三方庫(kù)讀寫SQLite數(shù)據(jù)庫(kù)的方法步驟
- Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
- python處理SQLite數(shù)據(jù)庫(kù)的方法
- SQLite5-使用Python來(lái)讀寫數(shù)據(jù)庫(kù)
- Pandas使用SQLite3實(shí)戰(zhàn)
相關(guān)文章
pycharm中:OSError:[WinError?1455]頁(yè)面文件太小無(wú)法完成操作問(wèn)題的多種解決方法
這篇文章主要給大家介紹了關(guān)于pycharm中:OSError:[WinError?1455]頁(yè)面文件太小無(wú)法完成操作問(wèn)題的多種徹底解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02
Python小工具之消耗系統(tǒng)指定大小內(nèi)存的方法
今天小編就為大家分享一篇Python小工具之消耗系統(tǒng)指定大小內(nèi)存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Scrapy之爬取結(jié)果導(dǎo)出為Excel的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Scrapy之爬取結(jié)果導(dǎo)出為Excel的實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python深入學(xué)習(xí)之對(duì)象的屬性
這篇文章主要介紹了Python深入學(xué)習(xí)之對(duì)象的屬性,本文從較深的層次講解對(duì)象屬性的內(nèi)部運(yùn)行方式,需要的朋友可以參考下2014-08-08
Python3批量移動(dòng)指定文件到指定文件夾方法示例
這篇文章主要給大家介紹了關(guān)于Python3批量移動(dòng)指定文件到指定文件夾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python3具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python處理中文標(biāo)點(diǎn)符號(hào)大集合
中文文本中可能出現(xiàn)的標(biāo)點(diǎn)符號(hào)來(lái)源比較復(fù)雜,通過(guò)匹配等手段對(duì)他們處理的時(shí)候需要格外小心,防止遺漏,下面小編給大家?guī)?lái)了Python處理中文標(biāo)點(diǎn)符號(hào)大集合,感興趣的朋友跟隨腳本之家小編一起看看吧2018-05-05
python 點(diǎn)云地面點(diǎn)濾波-progressive TIN densification(PTD)算法介紹
關(guān)于地面點(diǎn)濾波的概念我們要與孤立點(diǎn)(outlier)濾波區(qū)分開,孤立點(diǎn)濾波可以理解為圖像中的去噪,去除數(shù)據(jù)測(cè)量過(guò)程中受到飛鳥、多路徑效應(yīng)所產(chǎn)生的遠(yuǎn)低于/高于其他數(shù)據(jù)的點(diǎn)。今天通過(guò)本文給大家分享python PTD點(diǎn)云地面點(diǎn)濾波的相關(guān)知識(shí),一起看看吧2021-08-08
通過(guò)數(shù)據(jù)庫(kù)對(duì)Django進(jìn)行刪除字段和刪除模型的操作
這篇文章主要介紹了通過(guò)數(shù)據(jù)庫(kù)對(duì)Django進(jìn)行刪除字段和刪除模型的操作,這里假設(shè)我們已經(jīng)建立了一個(gè)名為book的數(shù)據(jù)模型,需要的朋友可以參考下2015-07-07

