Python SQLite3 保姆級教程:從零開始學數據庫操作

Python SQLite3 保姆級教程:從零開始學數據庫操作

本文適合純新手!無需任何數據庫基礎,跟著步驟操作即可掌握 SQLite3 的核心用法。
目標:讓你像用記事本一樣輕松操作數據庫!


目錄

  1. 什么是 SQLite3?
  2. 環境準備
  3. 連接數據庫
  4. 創建表
  5. 增刪改查(CRUD)
  6. 事務與錯誤處理
  7. 高級技巧
  8. 常見問題
  9. 總結

1. 什么是 SQLite3?

SQLite3 是一個輕量級的 嵌入式數據庫,無需安裝獨立服務,所有數據存儲在一個文件中。

  • ? 無需配置:像操作普通文件一樣使用。
  • ? 跨平臺:數據庫文件可在 Windows/macOS/Linux 共享。
  • ? 適合小型項目:APP 配置、本地緩存、小型網站等。

2. 環境準備

2.1 確認 Python 環境

確保已安裝 Python(建議 3.6+)。打開終端輸入以下命令:

python --version

若顯示版本號(如 Python 3.8.5)則正常。若報錯,需先 安裝 Python。

2.2 導入 SQLite3 模塊

無需額外安裝!Python 自帶 sqlite3 庫,直接在代碼中導入:

import sqlite3

3. 連接數據庫

3.1 連接到磁盤數據庫(持久化)

# 連接到當前目錄下的 test.db 文件(不存在則自動創建)
conn = sqlite3.connect('test.db')
  • ? 文件路徑規則
    • 'test.db':當前目錄下的 test.db 文件。
    • '/home/user/data.db':絕對路徑指定位置。
  • ? 注意:關閉程序后文件依然存在,下次可重新連接。

3.2 連接到內存數據庫(臨時使用)

conn = sqlite3.connect(':memory:')  # 程序關閉后數據消失

3.3 創建游標(操作數據庫的“手”)

cursor = conn.cursor()  # 所有 SQL 操作通過游標執行

4. 創建表

4.1 基本語法

# 創建 users 表(如果不存在)
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,  # 自增主鍵name TEXT NOT NULL,                    # 文本類型,不能為空age INTEGER,                           # 整數類型email TEXT UNIQUE                      # 唯一約束(郵箱不可重復))
''')
conn.commit()  # 提交事務(創建表需要提交)

4.2 字段類型

類型說明
INTEGER整數(如 1, -5, 100)
TEXT字符串(如 “Hello”)
REAL浮點數(如 3.14)
BLOB二進制數據(如圖片)

4.3 驗證表是否創建成功

# 查詢數據庫中所有表名
cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
print(cursor.fetchall())  # 輸出:[('users',)]

5. 增刪改查(CRUD)

5.1 插入數據(Create)

插入單條數據
# 使用 ? 占位符避免 SQL 注入
cursor.execute('''INSERT INTO users (name, age, email)VALUES (?, ?, ?)
''', ('Alice', 30, 'alice@example.com'))
conn.commit()  # 提交!
批量插入數據
users = [('Bob', 25, 'bob@example.com'),('Charlie', 35, 'charlie@example.com')
]
cursor.executemany('''INSERT INTO users (name, age, email) VALUES (?, ?, ?)
''', users)
conn.commit()

5.2 查詢數據(Read)

查詢所有記錄
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()  # 獲取全部結果
for row in rows:print(row)  # 輸出:(1, 'Alice', 30, 'alice@example.com')
條件查詢
# 查找年齡大于 28 的用戶
cursor.execute('SELECT * FROM users WHERE age > ?', (28,))
results = cursor.fetchall()
for row in results:print(f"ID: {row[0]}, 姓名: {row[1]}, 年齡: {row[2]}")
查詢單條記錄
cursor.execute('SELECT * FROM users WHERE id = ?', (1,))
user = cursor.fetchone()  # 只獲取第一條
print(user)  # 輸出:(1, 'Alice', 30, 'alice@example.com')

5.3 更新數據(Update)

# 將 Alice 的郵箱更新為 new_email@example.com
cursor.execute('''UPDATE usersSET email = ?WHERE name = ?
''', ('new_email@example.com', 'Alice'))
conn.commit()

5.4 刪除數據(Delete)

# 刪除 ID 為 2 的用戶
cursor.execute('DELETE FROM users WHERE id = ?', (2,))
conn.commit()

6. 事務與錯誤處理

6.1 什么是事務?

  • 事務:一組原子性的操作,要么全部成功,要么全部失敗。
  • 示例:轉賬操作(A 扣款,B 加款必須同時成功)。

6.2 手動提交與回滾

try:cursor.execute("INSERT INTO users (name) VALUES ('David')")cursor.execute("INSERT INTO users (name) VALUES ('Eve')")conn.commit()  # 成功則提交
except sqlite3.Error as e:print("出錯啦:", e)conn.rollback()  # 失敗則回滾(撤銷所有操作)

6.3 自動提交(推薦)

使用 with 上下文管理器:

with sqlite3.connect('test.db') as conn:cursor = conn.cursor()cursor.execute("INSERT INTO users (name) VALUES ('Frank')")# 無需 commit,退出 with 塊時自動提交

7. 高級技巧

7.1 以字典形式返回結果

默認返回元組,可通過 row_factory 改為字典:

def dict_factory(cursor, row):return {col[0]: row[idx] for idx, col in enumerate(cursor.description)}conn.row_factory = dict_factory
cursor = conn.cursor()
cursor.execute('SELECT * FROM users WHERE id = 1')
print(cursor.fetchone())  # 輸出:{'id': 1, 'name': 'Alice', ...}

7.2 使用 SQLite 瀏覽器查看數據

推薦工具:DB Browser for SQLite

  • 可視化查看表結構、數據。
  • 直接執行 SQL 語句。

8. 常見問題

Q1:代碼運行后找不到數據庫文件?

  • 檢查當前目錄:在代碼中添加:
    import os
    print(os.getcwd())  # 查看文件實際保存路徑
    
  • 使用絕對路徑:如 sqlite3.connect('/User/name/data.db')

Q2:插入數據后查詢不到?

  • 忘記提交事務:確保執行 conn.commit()
  • 查詢條件錯誤:檢查 WHERE 子句是否拼寫正確。

Q3:如何備份數據庫?

直接復制 .db 文件即可!SQLite 數據庫是單一文件。


9. 總結

通過本教程,你已經學會了:

  1. 連接數據庫(文件 vs 內存)
  2. 創建表(字段類型與約束)
  3. 增刪改查(參數化查詢防注入)
  4. 事務管理(提交與回滾)
  5. 高級技巧(字典結果、可視化工具)

下一步建議

  • 嘗試為本地的通訊錄、筆記應用添加數據庫支持。
  • 學習更復雜的 SQL 語法(如 JOIN 查詢)。

遇到問題? 隨時查閱本文代碼示例,或使用 SQLite 瀏覽器調試!

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

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

相關文章

C語言中的整數類型(short,int,long和long long)

整數是編程中最常見的一種數據類型,C語言提供了多種整數類型,包括 short、int、long 和 long long,它們的主要區別在于存儲范圍和內存占用的大小。 本節將詳細講解這些整數類型的定義、特性、使用場景以及注意事項,幫助你全面理解…

使用jcodec庫,訪問網絡視頻提取封面圖片上傳至oss

注釋部分為FFmpeg(確實方便但依賴太大,不想用) package com.zuodou.upload;import com.aliyun.oss.OSS; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.zuodou.oss.OssProperties;…

游戲引擎學習第147天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 上一集回顧 具體來說,我們通過隱式計算來解決問題,而不是像數字微分分析器那樣逐步增加數據。我們已經涵蓋了這個部分,并計劃繼續處理音量問題。不過,實際上我們現在不需要繼續處理…

使用Dockerfile打包java項目生成鏡像部署到Linux_java項目打docker鏡像的dockerfile

比起容器、鏡像來說,Dockerfile 非常普通,它就是一個純文本,里面記錄了一系列的構建指令,比如選擇基礎鏡像、拷貝文件、運行腳本等等,每個指令都會生成一個 Layer,而 Docker 順序執行這個文件里的所有步驟&…

Linux -- 磁盤結構、文件系統ext2

一、磁盤 1.磁盤的物理結構 2.磁盤的存儲結構 盤片:是機械硬盤存儲數據的主要介質,一般由鋁合金或玻璃等材料制成,表面涂有一層磁性材料。數據通過磁頭在盤片的磁性涂層上進行磁化來記錄,磁化的不同方向代表二進制的 0 和 1。盤面…

標量、向量、矩陣與張量:從維度理解數據結構的層次

在數學和計算機科學中,維度描述了數據結構的復雜性,而標量、向量、矩陣、張量則是不同維度的數據表示形式。它們的關系可以理解為從簡單到復雜的擴展,以下是詳細解析: 1. 標量(Scalar):0維數據 定義:單個數值,沒有方向,只有大小。 維度:0維(無索引)。 示例: 溫度…

點云數據處理--splat轉3dtiles

文章目錄 處理流程簡介核心功能實現數據讀取與格式轉換定義Point類數據讀取splat轉gltf 點云數據分割定義四叉樹遞歸生成3dtiles瓦片 生成tileset.json遞歸生成tileset.json計算box 主函數調用渲染 下一步工作性能優化渲染效果調優其他 源碼地址: github 處理流程簡…

OneM2M:全球性的物聯網標準-可應用于物聯網中

OneM2M 是一個全球性的物聯網(IoT)標準,旨在為物聯網設備和服務提供統一的框架和接口,以實現設備之間的互操作性、數據共享和服務集成。OneM2M 由多個國際標準化組織(如 ETSI、TIA、TTC、ARIB 等)共同制定,目標是解決物聯網領域的碎片化問題,提供一個通用的標準,支持跨…

【Python 入門基礎】—— 人工智能“超級引擎”,AI界的“瑞士軍刀”,

歡迎來到ZyyOvO的博客?,一個關于探索技術的角落,記錄學習的點滴📖,分享實用的技巧🛠?,偶爾還有一些奇思妙想💡 本文由ZyyOvO原創??,感謝支持??!請尊重原創&#x1…

Java爬蟲獲取淘寶商品詳情數據的完整指南

在電商領域,獲取商品詳情數據對于市場分析、價格監控、用戶體驗優化等場景具有重要意義。淘寶作為國內領先的電商平臺,提供了豐富的API接口供開發者使用,其中item_get和item_get_pro接口可以用來獲取商品的詳細信息。本文將詳細介紹如何使用J…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_init_cycle 函數

nei聲明在 src/core/ngx_cycle.h ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);實現在 src/core/ngx_cycle.c ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle) {void *rv;char **senv;ngx_uint_t i, n;ngx_log_t …

qt 操作多個sqlite文件

qt 操作多個sqlite文件 Chapter1 qt 操作多個sqlite文件1. 引入必要的頭文件2. 創建并連接多個SQLite數據庫3. 代碼說明4. 注意事項 Chapter2 qt 多線程操作sqlite多文件1. 引入必要的頭文件2. 創建數據庫操作的工作線程類3. 在主線程中創建并啟動多個工作線程4. 代碼說明5. 運…

最新版本WebContext構造函數-避坑

import org.thymeleaf.context.IWebContext; import org.thymeleaf.context.WebContext; 當你想把頁面信息全部獲取出來存到redis緩存中使用時,SpringWebContext在Spring5中報錯 SpringWebContext ctx new SpringWebContext(request, response,request.getServlet…

用Python分割并高效處理PDF大文件

在處理大型PDF文件時,將它們分解成更小、更易于管理的塊通常是有益的。這個過程稱為分區,它可以提高處理效率,并使分析或操作文檔變得更容易。在本文中,我們將討論如何使用Python和為Unstructured.io庫將PDF文件劃分為更小的部分。…

neo4j隨筆-將csv文件導入知識圖譜

目錄 導入前的準備 導入csv文件 導入nodes1.1.csv并動態為節點添加標簽 ?編輯導入relations1.1.csv并動態為關系添加標簽 結果 導入前的準備 我有兩個csv文件 nodes1.1.csv存放節點信息,用記事本打開,能正常顯示,且編碼為UTF-8,就可以…

cpu 多級緩存L1、L2、L3 與主存關系

現代 CPU 的多級緩存(L1、L2、L3)和主存(DRAM)構成了一個層次化的內存系統,旨在通過減少內存訪問延遲和提高數據訪問速度來優化計算性能。以下是對多級緩存和主存的詳細解析: 1. 緩存層次結構 現代 CPU 通…

C++:入門詳解(關于C與C++基本差別)

目錄 一.C的第一個程序 二.命名空間(namespace) 1.命名空間的定義與使用: (1)命名空間里可以定義變量,函數,結構體等多種類型 (2)命名空間調用(&#xf…

Python的學習篇(七)--網頁結構

七、網頁(HTML)結構 7.1 HTML介紹 HTML(Hyper Text Markup Language),超文本標記語言。 超文本:比文本的功能要強大,通過鏈接和交互式的方式來組織與呈現信息的文本形式。不僅僅有文本,還可以包含圖片、…

*VulnHub-FristiLeaks:1.3暴力解法、細節解法,主打軟硬都吃,隧道搭建、尋找exp、提權、只要你想沒有做不到的姿勢

*VulnHub-FristiLeaks:1.3暴力解法、細節解法,主打軟硬都吃,隧道搭建、尋找exp、提權、只要你想沒有做不到的姿勢 一、信息收集 1、掃靶機ip 經典第一步,掃一下靶機ip arp-scan -l 掃描同網段 nmap -sP 192.168.122.0/242、指紋掃描、端口…

PHP:格式化JSON為PHP語法格式

1. 原生函數 $arr [1,2,3,4]; $str var_export($a,true); var_dump($str); 2. 自定義方法 class Export{private static $space;private static function do($a, string $prev){$res ;$next $prev . self::$space;if (is_array($a)) {$res . [;foreach ($a as $k > $…