python sqlite3模塊

十分想念順店雜可。。。

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 支持動態類型,常用類型:INTEGERTEXTREALBLOB)。

# 創建用戶表(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()

四、常見錯誤與注意事項

  1. SQL 注入風險
    禁止用字符串拼接構造 SQL(如f"INSERT INTO users VALUES ({name})"),必須用參數化查詢(?占位符)。

  2. 數據類型
    SQLite 是動態類型,字段類型聲明僅為建議(如INTEGER字段可存入字符串),需在應用層保證類型正確。

  3. 并發寫入
    SQLite 適合單線程或低并發場景,高并發寫入可能導致鎖表(同一時間僅允許一個寫操作)。

  4. 事務未提交
    插入 / 更新 / 刪除后未調用commit(),數據不會寫入數據庫(僅在內存中臨時存在)。

  5. 表已存在
    創建表時添加IF NOT EXISTS,避免table already exists錯誤。

五、適用場景

  • 小型應用或工具(如本地配置存儲、日志記錄);
  • 原型開發(快速搭建,無需部署數據庫服務器);
  • 嵌入式設備(資源有限,無需獨立數據庫進程);
  • 測試環境(輕量、易部署)。

總結

sqlite3模塊提供了簡潔的接口操作 SQLite 數據庫,核心流程為:
連接數據庫 → 獲取游標 → 執行 SQL → 處理結果 → 提交事務 → 關閉連接
通過參數化查詢、事務管理和上下文管理器,可安全高效地實現本地數據存儲,是輕量級場景的理想選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95495.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用 Python 繪制企業年度財務可視化報告 —— 從 Excel 到 9 種圖表全覆蓋

用 Python 繪制企業年度財務可視化報告 —— 從 Excel 到 9 種圖表全覆蓋在企業經營分析中,光看一堆財務數字很難直觀發現規律和問題。 如果能將這些數據轉化為可視化圖表,不僅更美觀,還能幫助管理層快速做出決策。今天,我就用 Py…

一次 Unity ? Android 基于 RSA?OAEP 的互通踩坑記

這篇分享,記錄我如何從“Base64 報錯/平臺不支持/解密失敗”一路定位到“填充算法不一致”的根因,并給出兩條穩定落地方案。同時整理了調試手冊、代碼片段和上線前自檢清單,方便你復用。 背景 Unity 端用公鑰加密一段緊湊 JSON(i…

Go語言GC機制:高效并發回收解析

Go 語言的垃圾回收(Garbage Collection,簡稱 GC)是其自動內存管理的核心機制,旨在自動識別并回收不再被使用的內存,避免內存泄漏,減輕開發者的手動內存管理負擔。Go 的 GC 算法經歷了多次迭代優化&#xff…

imx6ull-驅動開發篇23——Linux 內核定時器實驗

目錄 實驗程序編寫 修改設備樹文件 定時器驅動程序 timer.c 測試 timerApp.c Makefile 文件 運行測試 實驗程序編寫 本講實驗,我們使用正點原子I.MX6U-ALPHA 開發板,通過linux內核定時器周期性的點亮和熄滅開發板上的 LED 燈, LED 燈…

IPTV系統:開啟視聽與管理的全新篇章

在當今數字化飛速發展的時代,IPTV系統正以前所未有的姿態,重塑著我們的視聽體驗與管理模式。它不僅僅是一套技術系統,更是連接信息、溝通情感、提升效率的橋梁,為各個領域帶來了全新的變革與發展機遇。從電視直播的角度來看&#…

PyTorch筆記9----------Cifar10圖像分類

1.圖像分類網絡模型框架解讀 分類網絡的基本結構 數據加載模塊:對訓練數據加載數據重組:組合成網絡需要的形式,例如預處理、增強、各種網絡處理、loss函數計算優化器 數據加載模塊 使用公開數據集:torchvision.datasets使用自定義…

飛凌OK3568開發板QT應用程序編譯流程

飛凌OK3568開發板QT應用程序編譯流程開發環境:ubuntu20.04(主機)、飛凌OK3568開發板一般在linux系統下開發用于ARM開發板的QT應用程序時,直接在主機上開發然后進行交叉編譯即可,但有時候ARM開發板的廠家提供的SDK中可能…

飛算JavaAI合并項目實戰:7天完成3年遺留系統重構

引言 企業數字化進程中,遺留系統改造始終是CIO面臨的頭號難題。某電商平臺的實踐數據顯示:3年以上的Java項目平均存在47%的冗余代碼,63%的架構設計不符合當前業務需求,進行系統性重構需要投入相當于原開發量200%的資源。傳統&quo…

衛星速度增量和比沖及推力之間的關系

一、定義1.1.比沖(Isp):比沖是衡量發動機性能的重要指標,反映了單位重量推進劑在發動機中產生的沖量,單位為米/秒(m/s),代表燃料燃燒時噴流速度。這個單位與速度單位“米/秒”相同&a…

MATLAB繪制各種心形曲線

1.方程(1)心形線的經典隱函數方程為:(2)參數方程(更平滑的心形):(3)極坐標心形線(4)參數方程(3D心形)(5)隱函數3D心形2. MATLAB代碼clc;close all;clear all;warning off;%清除變量 rand(seed, 100); randn…

Django REST Framework視圖

Django REST Framework (DRF) 視圖類詳解DRF 提供了豐富的視圖類來構建 API,從基礎到高級,滿足不同復雜度的需求。以下是 DRF 的主要視圖類及其使用場景:1. 基礎視圖類APIView所有 DRF 視圖的基類,相當于 Django 的 View 類的增強…

Linux面試題及詳細答案 120道(1-15)-- 基礎概念

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

week1-[分支結構]中位數

week1-[分支結構]中位數 題目描述 給定 444 個正整數 a,b,c,da,b,c,da,b,c,d,輸出它們的中位數,答案四舍五入保留 111 位小數。 輸入格式 輸入共 111 行 444 個正整數 a,b,c,da,b,c,da,b,c,d。 輸出格式 輸出共 111 行 111 個浮點數表示答案。 樣例 #1 樣…

[激光原理與應用-259]:理論 - 幾何光學 - 平面鏡的反射、平面透鏡的折射、平面鏡的反射成像、平面透鏡的成像的規律

一、平面鏡的反射規律平面鏡的反射遵循鏡面反射定律,即光線在光滑表面(反射面平整度遠大于波長)發生反射時,滿足以下條件:反射光線、入射光線與法線共面:反射光線、入射光線和法線(垂直于反射面…

相機按鍵功能解析

相機按鍵功能解析佳能相機按鍵機身背面機身正面機身頂部機身側面 佳能相機按鍵 機身背面取景器目鏡:用于拍攝時觀察相機形成的圖像。實拍顯示/視頻拍攝按鈕:按下即可開始拍攝或錄制視頻。光圈/曝光補償鍵:調整光圈大小和曝光補償,…

51單片機-驅動LED模塊教程

本章思維導圖: 51單片機驅動LED燈模塊 LED燈元器件簡介 LED(Light Emitting Diode,發光二極管) 是一種固態半導體器件,通過P-N結中電子與空穴復合直接將電能轉化為光能。其核心結構由P型半導體(空穴主導&a…

Git 完全手冊:從入門到團隊協作實戰(2)

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

c語言中堆和棧的區別

1.棧區(stack):由編譯器自動分配釋放&#xff0c;棧主要用于存儲局部變量、函數參數、函數調用和返回信息等。其操作方式類似于數據結構中的棧。 2.堆區(heap):一般由程序員分配釋放&#xff0c;若程序員不釋放&#xff0c;則可能會引起內存泄漏。注堆和數據結構中的堆棧不一樣…

華為實驗WLAN 基礎配置隨練

業務vlan 20 192.168.20.x管理vlan 100 192.168.100.x步驟① 網絡互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

問題 在一個CMakeLists.txt文件里面看到了下面的這句話 find_package(Python2 COMPONENTS Interpreter Development NumPy)這個好有趣啊&#xff0c;Python2也是一個C的庫嗎&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …