成人欧美一区二区三区的电影,日韩一级一欧美一级国产,国产成人国拍亚洲精品,无码人妻精品一区二区三区毛片,伊人久久无码大香线蕉综合

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

SQLite 數(shù)據(jù)庫從入門到精通

admin
2025年10月18日 0:1 本文熱度 350

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ù)。


數(shù)據(jù)庫文件:數(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ù)庫。也可以用 .sqlite3 來表示。

自包含:SQLite 是一個純 C 實現(xiàn)的數(shù)據(jù)庫引擎,所有的功能都可以在一個獨立的文件中運行,因此非常適合嵌入式系統(tǒng)。

輕量級數(shù)據(jù)庫文件大小非常小,甚至可以嵌入到應(yīng)用程序中。


高效性:SQLite 以高速讀取數(shù)據(jù)為優(yōu)勢,適合于小型到中型的數(shù)據(jù)存儲需求。

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ù)等)。



002 
SQLite 數(shù)據(jù)庫與DB Browser for SQLite 工具的開發(fā)者

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ù)庫引擎的訪問。

sqlite3 模塊會自動鏈接到 Python 解釋器所使用的 SQLite 版本。這個版本是 Python 安裝時自帶的 SQLite 引擎的版本,而不是你安裝的 SQLite 數(shù)據(jù)庫版本(一般不會自己單獨安裝)。

Python sqlite3 模塊:該模塊提供了 Python 對 SQLite 引擎的訪問。實際上,sqlite3 模塊是基于 SQLite C API 來實現(xiàn)的,它利用 Python 的 C 擴展來與底層的 SQLite 引擎進行交互。

SQLite 數(shù)據(jù)庫源碼:用 C 語言實現(xiàn),負責處理所有底層數(shù)據(jù)庫的操作和邏輯。

Python sqlite3 模塊通常會綁定到一個特定的 SQLite 版本,比如當前常用的 Python 版本可能會綁定到 SQLite 3.x

具體版本:每個 Python 版本會捆綁一個固定版本的 SQLite 引擎。你可以通過 sqlite3 模塊來查詢當前綁定的 SQLite 版本。可以通過以下代碼查詢當前 Python sqlite3 模塊所綁定的 SQLite 版本:

import sqlite3print(sqlite3.sqlite_version)

輸出結(jié)果將顯示當前 sqlite3 模塊使用的 SQLite 引擎版本。例如,可能會顯示 3.35.5 或其他版本。

?004 在DB Browser for SQLite 中創(chuàng)建一個新的 SQLite 數(shù)據(jù)庫

  1. 打開 DB Browser for SQLite工具。

  2. 點擊 "文件" 菜單中的 "新建數(shù)據(jù)庫",或者直接按 Ctrl+N。

選擇一個存儲位置并為新數(shù)據(jù)庫指定一個文件名(例如:my_database.db),然后點擊 "保存"

  1. 在點擊"保存"后自動彈出如下畫面,以便創(chuàng)建一個表來存儲數(shù)據(jù)。按照以下步驟操作:

  2. 在彈出的窗口中,輸入表名(例如:users)并定義表的字段。

    • 輸入字段名(例如:id、name、age)。

    • 設(shè)置字段類型(例如:INTEGER、TEXTINTEGER)。

    • 確定哪一個字段作為主鍵,通常你可以選擇 id 作為主鍵并勾選 "主鍵"。

    • 如果你希望 id 字段能自動遞增(即每次插入一條新數(shù)據(jù),id 會自動加 1),可以勾選 “自增”(在 id 那一行)。

6. 完成表結(jié)構(gòu)定義后,點擊 "確定" 保存表格。

7. 表格創(chuàng)建完畢后,你可以插入一些數(shù)據(jù):

點擊 "數(shù)據(jù)瀏覽" 標簽,選擇你剛創(chuàng)建的表(例如:users)。

在數(shù)據(jù)表界面中,點擊 "插入一條新記錄" 按鈕。我點擊了4次。

輸入數(shù)據(jù)(例如:id = 1,name = 'Alice'age = 30。

8. 在 執(zhí)行 SQL 里運行以下語句插入一些測試數(shù)據(jù)

INSERT INTO users (name, age) VALUES ('Bob'30);INSERT INTO users (name, age) VALUES ('Charlie'28);

因為 id 是自增的,所以不用寫,SQLite 會自動生成 5、6。

9. 查看數(shù)據(jù),執(zhí)行:

SELECT * FROM users;

005 練習常見的 增刪查改 (CRUD) SQL 語句

表名是 users,字段有 idname、age。下面是一些例子:


1?? 插入數(shù)據(jù)(INSERT)

-- 插入一條新記錄(id 會自動生成)
INSERT INTO users (name, age) VALUES ('HanMeiMei'22);

-- 一次插入多條記錄
INSERT INTO users (name, age) VALUES
('LiLei'24),
('ZhangSan'35);



2?? 查詢數(shù)據(jù)(SELECT)

-- 查詢所有名字和年齡
SELECT name, age FROM users;

-- 查詢年齡大于30的人
SELECT FROM users WHERE age 30;

-- 查詢名字里包含 'Yang' 的人
SELECT FROM users WHERE name LIKE'%Yang%';

-- 按年齡從大到小排序
SELECT FROM users ORDER BY age DESC;

中文解釋

  • SELECT * FROM users
    從 users 表中查詢 所有字段(即整行數(shù)據(jù))。

  • ORDER BY age DESC
    按照 age 字段進行排序,DESC 表示 降序排列(從大到?。?/span>
    如果用 ASC,就是 升序(從小到大),默認就是 ASC。

-- 查詢前3條數(shù)據(jù)
SELECT FROM users LIMIT 3;



3?? 更新數(shù)據(jù)(UPDATE)

-- 把名字為 'Bob' 的年齡修改為 40
UPDATE users SET age =40 WHERE name ='Bob';

-- 給所有年齡小于30的人加 1 歲
UPDATE users SET age = age +WHERE age <30;

-- 修改 id=2 的名字
UPDATE users SET name ='YangUpdated' WHERE id =2;



4?? 刪除數(shù)據(jù)(DELETE)

? 注意:DELETE 會真正刪除數(shù)據(jù),不可撤銷。

-- 刪除名字是 'Charlie' 的用戶
DELETE FROM users WHERE name ='Charlie';

-- 刪除年齡大于50的用戶
DELETE FROM users WHERE age >50;
-- 刪除所有記錄(表還在,但數(shù)據(jù)全沒了)
DELETE FROM users;

006 在Python代碼中實現(xiàn)以上操作

用標準庫 sqlite3在本地創(chuàng)建 SQLite 數(shù)據(jù)庫文件,并完成:建庫/建表 → 插入數(shù)據(jù) → 查詢 → 更新 → 刪除,全流程示例。

1. 新建一個Python文件: sqlite_demo.py

2.插播基礎(chǔ)知識回顧:

3.列表(list)
你看到的 [(1, 'Alice', 25), (2, 'Bob', 30)] 里面的 [] 就是 Python 的列表(list)

1. [] 在 Python 里表示什么?

  • [] 定義了一個 列表(list)。

  • 列表是 Python 里最常用的數(shù)據(jù)類型之一:

    • 有序(按插入順序存放元素)。

    • 可變(可以增刪改元素)。

    • 可以存放不同類型的元素。


2. 在這個例子里

[(1, 'Alice', 25), (2, 'Bob', 30)]

  • 最外層的 [...] → 表示這是一個 列表。

  • 列表里有兩個元素:

    • (1, 'Alice', 25) → 一個元組

    • (2, 'Bob', 30) → 另一個元組

也就是說,這是一個 “元組的列表”。

3.開始寫程序了:

函數(shù)1def connect(db_path: Path) -> sqlite3.Connection:


注意connect 只是我定義的一個方法,后面會將具體的DB_PATH(數(shù)據(jù)庫文件的文件路徑對象)傳給(賦值)db_path,也就是給到sqlite3.connect()。

sqlite3.connect(db_path)會:打開一個數(shù)據(jù)庫文件(路徑由 db_path 指定)。
如果這個文件不存在,會自動創(chuàng)建一個新的數(shù)據(jù)庫文件。
返回一個 數(shù)據(jù)庫連接對象,類型是 sqlite3.Connection。


接下來我們要理解conn.row_factory = sqlite3.Row這句代碼的作用,不要這句代碼行不行?

  • row_factory=None → 返回元組

  • row_factory=sqlite3.Row → 返回 Row 對象

  • row_factory=dict_factory → 返回字典



函數(shù)2def reset_schema(conn: sqlite3.Connection):

函數(shù)reset_schema:重置數(shù)據(jù)庫表:如果反復運行腳本,先刪表再建表,避免報錯
使用 executescript 方法一次執(zhí)行多條 SQL

conn.commit()提交事務(wù),把上面創(chuàng)建表結(jié)構(gòu)的更改真正寫入數(shù)據(jù)庫

這兩句 SQL:

DROPTABLE IF EXISTS orders;
DROPTABLE IF EXISTS users;


逐句解釋

  1. DROP TABLE
    “刪除一張表”。執(zhí)行后,這張表里的數(shù)據(jù)和表結(jié)構(gòu)都會被移除。

  2. IF EXISTS
     “如果存在的話才刪除”。

    • 有表 → 刪除成功。

    • 沒表 → 什么都不做,也不會報錯。

  3. orders / users
    表的名字。


為什么先刪 orders 再刪 users

因為 orders 里可能有外鍵引用 users,如果先刪 users,會報錯。所以順序是:先刪子表(orders),再刪父表(users)


這兩句 SQL 的意思就是: 把舊的訂單表和用戶表都刪掉(如果它們存在的話),以便重新創(chuàng)建新的表結(jié)構(gòu)。

函數(shù)3def seed_data(conn: sqlite3.Connection):

插入演示數(shù)據(jù):3個用戶 + 3條訂單
users 表(用戶表)
id
name
age
email
created_at
1
Alice
25
alice@example.com
2025-09-11 10:00:00
2
Bob
30
bob@example.com
2025-09-11 10:00:01
3
Charlie
35
charlie@example.com
2025-09-11 10:00:02

說明:

  • id 是主鍵,自增生成。

  • created_at 默認是當前時間,每插一條記錄自動寫入。

orders 表(訂單表)

id
user_id
product
price
created_at
1
1
iPhone
6999.0
2025-09-11 10:00:05
2
1
AirPods
999.0
2025-09-11 10:00:06
3
2
MacBook
9999.0
2025-09-11 10:00:07

說明:

  • user_id = 1 的訂單屬于 Alice(她買了 iPhone 和 AirPods)。

  • user_id = 2 的訂單屬于 Bob(他買了 MacBook)。

  • Charlie(id=3)暫時沒有訂單。


聯(lián)表查詢(誰買了什么)

name
product
price
Alice
iPhone
6999.0
Alice
AirPods
999.0
Bob
MacBook
9999.0


通過 ON o.user_id = u.id 把訂單和用戶對上,就能清楚看到:

  • Alice 買了 iPhone、AirPods

  • Bob 買了 MacBook

  • Charlie 暫時沒下單,所以沒有記錄


在 SQLite 里,保證 orders.user_id 和 users.id 一一對應(yīng),有兩層辦法:


1. 外鍵約束(Foreign Key Constraint) ? 最常用的方法

建表時這樣寫:

解釋:

  • FOREIGN KEY (user_id):聲明 user_id 是外鍵。

  • REFERENCES users(id):它必須引用 users 表里的 id。

  • 效果:

  • 不能插入不存在的 user_id。


    1. 如果刪除了某個用戶,ON DELETE CASCADE 會自動刪除該用戶的訂單,避免出現(xiàn)“孤兒訂單”。

?? 注意:SQLite 默認 外鍵是關(guān)閉的,要顯式打開:

PRAGMA foreign_keys =ON;


2. 應(yīng)用層控制(編程時檢查)

在 Python 里,下單前先檢查用戶是否存在:



  • orders表的user_id就是從users表的id來的

函數(shù)4def query_examples(conn: sqlite3.Connection):

常見查詢示例:全表
常見查詢示例:條件、關(guān)聯(lián)
常見查詢示例:聚合、排序

每行在做什么

  1. SELECT u.name, SUM(o.price) AS total_spent

  • 選出用戶名稱 u.name,并對其訂單金額 o.price求和

  • SUM(...) 是聚合函數(shù),會把同一組(見 GROUP BY)的多行訂單加總成一行。

  • AS total_spent 給這一列起別名“total_spent”,下面 ORDER BY 可以直接用這個別名。

  1. 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)的用戶信息。

  1. GROUP BY u.id, u.name

  • 按 用戶進行分組聚合(同一個用戶的多條訂單歸為一組)。

  • 這里同時寫 u.id, u.name 是更穩(wěn)妥的寫法:

    • u.id 唯一標識用戶,避免同名不同人的混淆;

    • u.name 也在 GROUP BY 里,保證 SQL 標準兼容性。

  1. ORDER BY total_spent DESC

  • 按總消費額從高到低排序,誰花得多排在前面。

  1. .fetchall() 與 pprint([dict(r) for r in rows])

  • 取出所有結(jié)果行;
    -(若設(shè)置了 conn.row_factory = sqlite3.Row)把每行轉(zhuǎn)成字典,再美觀打印。

常見查詢示例:條件+排序+限制條數(shù)
假設(shè) users 表數(shù)據(jù):
id
name
age
1
Alice
25
2
Bob
30
3
Charlie
35

執(zhí)行查詢后結(jié)果:

  • 條件:只要 age >= 30 → 剩下 Bob(30)、Charlie(35)

  • 排序:按 age DESC → Charlie(35)、Bob(30)

  • 限制:最多 5 條 → 實際只有 2 條

最終打?。?/span>

函數(shù)5def 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ù)6def 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ù)7def create_indexes(conn: sqlite3.Connection):

創(chuàng)建索引

查詢現(xiàn)有索引

?

函數(shù)8def main():


OverOver!


閱讀原文:原文鏈接


該文章在 2025/10/18 11:17:59 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved