SQLite 數(shù)據(jù)庫從入門到精通
當前位置:點晴教程→知識管理交流
→『 技術(shù)文檔交流 』
001 了解一下 SQLite 數(shù)據(jù)庫 SQLite 是一個輕量級的嵌入式關(guān)系型數(shù)據(jù)庫,它非常適合嵌入式應(yīng)用和小型項目。 零配置:與傳統(tǒng)的數(shù)據(jù)庫系統(tǒng)(如 MySQL、PostgreSQL)不同,SQLite 不需要安裝和配置任何數(shù)據(jù)庫服務(wù)器,而是將整個數(shù)據(jù)庫存儲在一個單一的文件中,直接通過文件來存儲和讀取數(shù)據(jù)。 .db 或 .sqlite 文件中。SQLite 是一個以文件為基礎(chǔ)的數(shù)據(jù)庫引擎。每個數(shù)據(jù)庫都是一個普通的磁盤文件,所有的數(shù)據(jù)和結(jié)構(gòu)都存儲在這個文件中。![]() .db:這只是 SQLite 數(shù)據(jù)庫文件的常見擴展名。很多時候,這個擴展名是為了讓文件看起來像一個通用的數(shù)據(jù)庫文件,或者是根據(jù)開發(fā)人員的習慣命名。 .sqlite:這是 SQLite 數(shù)據(jù)庫的另一種常見擴展名,通常用于強調(diào)該文件是一個 SQLite 數(shù)據(jù)庫。也可以用 自包含:SQLite 是一個純 C 實現(xiàn)的數(shù)據(jù)庫引擎,所有的功能都可以在一個獨立的文件中運行,因此非常適合嵌入式系統(tǒng)。 B-tree 存儲:SQLite 使用 B-tree 結(jié)構(gòu)來存儲數(shù)據(jù),使得數(shù)據(jù)庫查詢高效。B-tree 是一種自平衡的數(shù)據(jù)結(jié)構(gòu),適用于高效查找、插入和刪除。 支持 SQL 語法:SQLite 支持標準的 SQL 語法,包括查詢、插入、刪除、更新等常用操作。 SQL 支持:SQLite 完全支持 SQL 標準,包含了大部分常用的 SQL 功能(如 JOIN、子查詢、事務(wù)等)。
SQLite 數(shù)據(jù)庫 是由 D. Richard Hipp 開發(fā)的,他是 SQLite 的創(chuàng)始人和主要維護者。SQLite 是一個開源項目,開發(fā)者通過它提供的 C 語言庫來實現(xiàn)數(shù)據(jù)庫功能。SQLite 數(shù)據(jù)庫本身是一個獨立的、嵌入式的數(shù)據(jù)庫引擎,主要面向需要輕量級、無需獨立數(shù)據(jù)庫服務(wù)器的應(yīng)用程序。 SQLite 數(shù)據(jù)庫引擎是開源的,因此它本身并不直接通過銷售許可或使用費來盈利。然而,SQLite 的開發(fā)和維護有一些間接的盈利來源和商業(yè)模式。 SQLite 的核心代碼是 開源 的,并且遵循 公有領(lǐng)域許可(Public Domain License),這意味著任何人都可以自由地使用、修改和分發(fā) SQLite 的代碼,而不需要支付費用或獲得授權(quán)。由于它是公有領(lǐng)域(Public Domain),SQLite 的核心代碼沒有任何版權(quán)或許可證費用要求。 咨詢和技術(shù)支持:對于需要高質(zhì)量支持或?qū)?shù)據(jù)庫有特殊要求的企業(yè),SQLite 的開發(fā)團隊或第三方公司提供定制的技術(shù)支持和咨詢服務(wù)。 定制開發(fā):一些公司可能需要定制版本的 SQLite,或者需要額外的功能和優(yōu)化,SQLite 的開發(fā)者可以為這些公司提供定制開發(fā)服務(wù)。 企業(yè)級解決方案:盡管 SQLite 是輕量級的,仍然有企業(yè)使用 SQLite 作為嵌入式數(shù)據(jù)庫。對于這些公司,提供額外的企業(yè)級支持和優(yōu)化服務(wù)可能是 SQLite 開發(fā)者的盈利來源。 DB Browser for SQLite 是由 社區(qū)開發(fā)者 維護的開源工具,它旨在為 SQLite 提供一個 圖形化的界面,使用戶能夠方便地瀏覽、管理和編輯 SQLite 數(shù)據(jù)庫。是由一群志愿開發(fā)者貢獻代碼來提供圖形化支持。DB Browser for SQLite 使用廣泛,特別是對于那些不想在命令行中操作 SQLite 的用戶。
003 SQLite 數(shù)據(jù)庫與Python 標準庫中的 sqlite3 模塊 sqlite3是一個 Python 的數(shù)據(jù)庫接口模塊,它為 Python 程序員提供了對 SQLite 數(shù)據(jù)庫 的訪問和操作能力。sqlite3 模塊是通過 C 語言編寫的,作為 Python 標準庫的一部分,封裝了對 SQLite 數(shù)據(jù)庫引擎的訪問。
Python SQLite 數(shù)據(jù)庫源碼:用 C 語言實現(xiàn),負責處理所有底層數(shù)據(jù)庫的操作和邏輯。 Python |
說明:
id
是主鍵,自增生成。
created_at
默認是當前時間,每插一條記錄自動寫入。
orders 表(訂單表)
說明:
user_id
= 1 的訂單屬于 Alice(她買了 iPhone 和 AirPods)。
user_id
= 2 的訂單屬于 Bob(他買了 MacBook)。
Charlie
(id=3)暫時沒有訂單。
聯(lián)表查詢(誰買了什么)
通過 ON o.user_id = u.id
把訂單和用戶對上,就能清楚看到:
Alice 買了 iPhone、AirPods
Bob 買了 MacBook
Charlie 暫時沒下單,所以沒有記錄
在 SQLite 里,保證 orders.user_id
和 users.id
一一對應(yīng),有兩層辦法:
建表時這樣寫:
解釋:
FOREIGN KEY (user_id)
:聲明 user_id
是外鍵。
REFERENCES users(id)
:它必須引用 users
表里的 id
。
效果:
不能插入不存在的 user_id
。
如果刪除了某個用戶,ON DELETE CASCADE
會自動刪除該用戶的訂單,避免出現(xiàn)“孤兒訂單”。
?? 注意:SQLite 默認 外鍵是關(guān)閉的,要顯式打開:
PRAGMA foreign_keys =ON;
在 Python 里,下單前先檢查用戶是否存在:
orders表的
user_id就是從users表的
id來的
函數(shù)4:def query_examples(conn: sqlite3.Connection):
常見查詢示例:全表
常見查詢示例:條件、關(guān)聯(lián)
常見查詢示例:聚合、排序
SELECT u.name, SUM(o.price) AS total_spent
選出用戶名稱 u.name
,并對其訂單金額 o.price
求和。
SUM(...)
是聚合函數(shù),會把同一組(見 GROUP BY)的多行訂單加總成一行。
AS total_spent
給這一列起別名“total_spent”,下面 ORDER BY
可以直接用這個別名。
FROM orders o JOIN users u ON o.user_id = u.id
把 訂單表 orders
(別名 o
)和 用戶表 users
(別名 u
)按外鍵關(guān)系聯(lián)結(jié):o.user_id = u.id
。
聯(lián)結(jié)后,每一行訂單都帶上了對應(yīng)的用戶信息。
GROUP BY u.id, u.name
按 用戶進行分組聚合(同一個用戶的多條訂單歸為一組)。
這里同時寫 u.id, u.name
是更穩(wěn)妥的寫法:
u.id
唯一標識用戶,避免同名不同人的混淆;
u.name
也在 GROUP BY 里,保證 SQL 標準兼容性。
ORDER BY total_spent DESC
按總消費額從高到低排序,誰花得多排在前面。
.fetchall()
與 pprint([dict(r) for r in rows])
取出所有結(jié)果行;
-(若設(shè)置了 conn.row_factory = sqlite3.Row
)把每行轉(zhuǎn)成字典,再美觀打印。
常見查詢示例:條件+排序+限制條數(shù)
假設(shè) users
表數(shù)據(jù):
執(zhí)行查詢后結(jié)果:
條件:只要 age >= 30
→ 剩下 Bob(30)、Charlie(35)
排序:按 age DESC → Charlie(35)、Bob(30)
限制:最多 5 條 → 實際只有 2 條
最終打?。?/span>
函數(shù)5:def query_examples(conn: sqlite3.Connection):
更新示例:單行、多行、表達式更新
-- 把 Alice 的年齡改為 26:
{'age': 26,
'created_at': '2025-09-11 13:29:22',
'email': 'alice@example.com',
'id': 1,
'name': 'Alice'}
-- 給所有年齡 < 30 的用戶郵箱統(tǒng)一改為 young@example.com:
[{'age': 26, 'email': 'young@example.com', 'name': 'Alice'},
{'age': 30, 'email': 'bob@example.com', 'name': 'Bob'},
{'age': 35, 'email': 'charlie@example.com', 'name': 'Charlie'}]
函數(shù)6:def delete_examples(conn: sqlite3.Connection):
-- 刪除用戶 Charlie(其訂單將被級聯(lián)刪除):
Charlie 刪除前的訂單條數(shù):0
Charlie 刪除后的訂單條數(shù):0
-- 剩余用戶:
[{'age': 26, 'id': 1, 'name': 'Alice'}, {'age': 30, 'id': 2, 'name': 'Bob'}]
函數(shù)7:def create_indexes(conn: sqlite3.Connection):
創(chuàng)建索引
查詢現(xiàn)有索引
?
函數(shù)8:def main():
閱讀原文:原文鏈接