Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫詳解
前言
在 Python 開發(fā)中,SQLite 是一種輕量級(jí)的關(guān)系型數(shù)據(jù)庫,它無需單獨(dú)安裝數(shù)據(jù)庫服務(wù)器,所有數(shù)據(jù)存儲(chǔ)在一個(gè)單獨(dú)的文件中,適用于小型應(yīng)用、移動(dòng)開發(fā)、數(shù)據(jù)分析等場景。Python 提供了內(nèi)置的 sqlite3 模塊,方便我們操作 SQLite 數(shù)據(jù)庫。本文將詳細(xì)介紹 sqlite3 模塊的使用,包括數(shù)據(jù)庫連接、表操作、數(shù)據(jù)增刪改查(CRUD),以及常見的事務(wù)管理和參數(shù)化查詢,幫助你快速掌握 Python 操作 SQLite 數(shù)據(jù)庫的方法。
1. 為什么選擇 SQLite?
? 零配置:Python 內(nèi)置支持,無需安裝額外數(shù)據(jù)庫服務(wù)。
? 文件存儲(chǔ):數(shù)據(jù)庫僅是一個(gè) .db 文件,便于管理。
? 輕量高效:適用于小型應(yīng)用、測試環(huán)境、移動(dòng)端存儲(chǔ)。
? SQL 支持:支持 SQL 語法,易于與其他數(shù)據(jù)庫遷移。
?? SQLite 適用場景:
- 桌面應(yīng)用(如瀏覽器、記事本應(yīng)用存儲(chǔ)用戶數(shù)據(jù))。
- 移動(dòng)應(yīng)用(Android、iOS 本地?cái)?shù)據(jù)庫)。
- 數(shù)據(jù)分析(存儲(chǔ)小型數(shù)據(jù)集,替代 CSV 文件)。
2. 連接 SQLite 數(shù)據(jù)庫
2.1 連接或創(chuàng)建數(shù)據(jù)庫
使用 sqlite3.connect() 連接數(shù)據(jù)庫:
import sqlite3
# 連接數(shù)據(jù)庫(如果不存在則創(chuàng)建)
conn = sqlite3.connect("example.db")
print("數(shù)據(jù)庫連接成功")
?? 特點(diǎn):
- 如果
example.db存在,則連接它,否則自動(dòng)創(chuàng)建該文件。
2.2 獲取游標(biāo)(Cursor)
數(shù)據(jù)庫操作需要使用 游標(biāo)對象(cursor):
cursor = conn.cursor()
?? 作用:
cursor.execute(sql)用于執(zhí)行 SQL 語句。cursor.fetchall()獲取查詢結(jié)果。
3. 創(chuàng)建表(CREATE TABLE)
使用 CREATE TABLE 語句創(chuàng)建數(shù)據(jù)庫表:
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ù)必小心:
- 沒有 WHERE 條件會(huì)刪除所有數(shù)據(jù)!
- 先
SELECT確認(rèn)數(shù)據(jù)是否存在。
8. 事務(wù)管理(commit() 和 rollback())
8.1 commit() 提交事務(wù)
conn.commit() # 確保數(shù)據(jù)寫入數(shù)據(jù)庫
?? 每次 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ù)庫。
9. 關(guān)閉數(shù)據(jù)庫連接
cursor.close()
conn.close()
print("數(shù)據(jù)庫連接已關(guān)閉")
?? 最佳實(shí)踐:
- 完成所有數(shù)據(jù)庫操作后,應(yīng)關(guān)閉連接,釋放資源。
10. 結(jié)合 with 語句自動(dòng)管理連接
Python 提供 with 語法,自動(dòng)關(guān)閉數(shù)據(jù)庫連接:
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())
?? 優(yōu)勢:
- 自動(dòng) commit()
- 異常發(fā)生時(shí)自動(dòng) rollback()
- 退出時(shí)自動(dòng)關(guān)閉 conn
11. 使用 Row 以字典方式訪問數(shù)據(jù)
默認(rèn) fetchall() 返回元組:
cursor.execute("SELECT * FROM users")
print(cursor.fetchone()) # (1, 'Alice', 25, 'New York')
可以改用 sqlite3.Row 使數(shù)據(jù)可用字典訪問:
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]這樣的索引訪問方式。
12. 結(jié)論
| 操作 | 代碼示例 |
|---|---|
| 連接數(shù)據(jù)庫 | 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ù)庫模塊,適用于小型應(yīng)用、測試、數(shù)據(jù)存儲(chǔ)等場景。掌握這些操作,你就可以輕松管理 SQLite 數(shù)據(jù)庫,提升開發(fā)效率!
總結(jié)
到此這篇關(guān)于Python中如何使用sqlite3操作SQLite數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)Python sqlite3操作SQLite內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python連接數(shù)據(jù)庫的3種方法對比(SQLite\MySQL\PostgreSQL)
- 在Python中使用SQLite數(shù)據(jù)庫進(jìn)行增刪改查操作的代碼示例
- python連接sqlite3簡單用法完整例子
- 利用Python連接MySQL超詳細(xì)實(shí)戰(zhàn)教程
- Python進(jìn)行SQLite和MySQL數(shù)據(jù)庫連接與操作的完整指南
- Python進(jìn)行PostgreSQL數(shù)據(jù)庫連接的詳細(xì)使用指南
- 使用python進(jìn)行PostgreSQL數(shù)據(jù)庫連接全過程
- Python連接PostgreSQL數(shù)據(jù)庫并查詢數(shù)據(jù)的詳細(xì)指南
- Python連接到PostgreSQL數(shù)據(jù)庫的方法詳解
- Python數(shù)據(jù)庫學(xué)習(xí)心得:SQLite、MySQL、PostgreSQL優(yōu)缺點(diǎn)
相關(guān)文章
Python程序打包工具py2exe和PyInstaller詳解
這篇文章主要介紹了Python程序打包工具py2exe和PyInstaller詳解,如果可以提前將程序打包成 Windows平臺(tái)的 .exe 文件或者是Linux下的 .sh 腳本,那么使用起來就會(huì)方便很多,需要的朋友可以參考下2019-06-06
Python練習(xí)之制作企業(yè)獎(jiǎng)金計(jì)算器
在本篇博客中,我們將使用Python代碼解決一個(gè)企業(yè)獎(jiǎng)金計(jì)算的問題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
Django的數(shù)據(jù)模型訪問多對多鍵值的方法
這篇文章主要介紹了Django的數(shù)據(jù)模型訪問多對多鍵值的方法,Django是Python豐富多彩的web框架中最具人氣的一個(gè),需要的朋友可以參考下2015-07-07
使用 Supervisor 監(jiān)控 Python3 進(jìn)程方式
今天小編就為大家分享一篇使用 Supervisor 監(jiān)控 Python3 進(jìn)程方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
訊飛webapi語音識(shí)別接口調(diào)用示例代碼(python)
這篇文章主要介紹了如何使用Python3調(diào)用訊飛WebAPI語音識(shí)別接口,重點(diǎn)解決了在處理語音識(shí)別結(jié)果時(shí)判斷是否為最后一幀的問題,通過運(yùn)行代碼并總結(jié)經(jīng)驗(yàn),解決了常見的模塊和屬性錯(cuò)誤,需要的朋友可以參考下2025-03-03
tensorflow中tf.reduce_mean函數(shù)的使用
這篇文章主要介紹了tensorflow中tf.reduce_mean函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

