LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SQLite 数据库从入门到精通

admin
2025年10月18日 0:1 本文热度 200

001 了解一下 SQLite 数据库

SQLite 是一个轻量级的嵌入式关系型数据库,它非常适合嵌入式应用和小型项目。

零配置与传统的数据库系统(如 MySQL、PostgreSQL)不同,SQLite 不需要安装和配置任何数据库服务器,而是将整个数据库存储在一个单一的文件中,直接通过文件来存储和读取数据


数据库文件:数据库的所有数据存储在一个 .db 或 .sqlite 文件中。SQLite 是一个以文件为基础的数据库引擎每个数据库都是一个普通的磁盘文件,所有的数据和结构都存储在这个文件中。

.db:这只是 SQLite 数据库文件的常见扩展名。很多时候,这个扩展名是为了让文件看起来像一个通用的数据库文件,或者是根据开发人员的习惯命名。

.sqlite:这是 SQLite 数据库的另一种常见扩展名,通常用于强调该文件是一个 SQLite 数据库。也可以用 .sqlite3 来表示。

自包含:SQLite 是一个纯 C 实现的数据库引擎,所有的功能都可以在一个独立的文件中运行,因此非常适合嵌入式系统

轻量级数据库文件大小非常小,甚至可以嵌入到应用程序中。


高效性:SQLite 以高速读取数据为优势,适合于小型到中型的数据存储需求。

B-tree 存储:SQLite 使用 B-tree 结构来存储数据,使得数据库查询高效。B-tree 是一种自平衡的数据结构,适用于高效查找、插入和删除。


支持 SQL 语法:SQLite 支持标准的 SQL 语法,包括查询、插入、删除、更新等常用操作。

SQL 支持:SQLite 完全支持 SQL 标准,包含了大部分常用的 SQL 功能(如 JOIN、子查询、事务等)。



002 
SQLite 数据库与DB Browser for SQLite 工具的开发者

SQLite 数据库 是由 D. Richard Hipp 开发的,他是 SQLite 的创始人和主要维护者。SQLite 是一个开源项目,开发者通过它提供的 C 语言库来实现数据库功能。SQLite 数据库本身是一个独立的、嵌入式的数据库引擎,主要面向需要轻量级、无需独立数据库服务器的应用程序。

SQLite 数据库引擎是开源的,因此它本身并不直接通过销售许可或使用费来盈利。然而,SQLite 的开发和维护有一些间接的盈利来源和商业模式。

SQLite 的核心代码是 开源 的,并且遵循 公有领域许可(Public Domain License),这意味着任何人都可以自由地使用、修改和分发 SQLite 的代码,而不需要支付费用或获得授权。由于它是公有领域(Public Domain),SQLite 的核心代码没有任何版权或许可证费用要求。

咨询和技术支持:对于需要高质量支持或对数据库有特殊要求的企业,SQLite 的开发团队或第三方公司提供定制的技术支持和咨询服务。

定制开发:一些公司可能需要定制版本的 SQLite,或者需要额外的功能和优化,SQLite 的开发者可以为这些公司提供定制开发服务。

企业级解决方案:尽管 SQLite 是轻量级的,仍然有企业使用 SQLite 作为嵌入式数据库。对于这些公司,提供额外的企业级支持和优化服务可能是 SQLite 开发者的盈利来源。

DB Browser for SQLite 是由 社区开发者 维护的开源工具,它旨在为 SQLite 提供一个 图形化的界面,使用户能够方便地浏览、管理和编辑 SQLite 数据库。是由一群志愿开发者贡献代码来提供图形化支持。DB Browser for SQLite 使用广泛,特别是对于那些不想在命令行中操作 SQLite 的用户。

003 SQLite 数据库与Python 标准库中的 sqlite3 模块

sqlite3是一个 Python 的数据库接口模块,它为 Python 程序员提供了对 SQLite 数据库 的访问和操作能力。sqlite3 模块是通过 C 语言编写的,作为 Python 标准库的一部分,封装了对 SQLite 数据库引擎的访问。

sqlite3 模块会自动链接到 Python 解释器所使用的 SQLite 版本。这个版本是 Python 安装时自带的 SQLite 引擎的版本,而不是你安装的 SQLite 数据库版本(一般不会自己单独安装)

Python sqlite3 模块:该模块提供了 Python 对 SQLite 引擎的访问。实际上,sqlite3 模块是基于 SQLite C API 来实现的,它利用 Python 的 C 扩展来与底层的 SQLite 引擎进行交互。

SQLite 数据库源码:用 C 语言实现,负责处理所有底层数据库的操作和逻辑。

Python sqlite3 模块通常会绑定到一个特定的 SQLite 版本,比如当前常用的 Python 版本可能会绑定到 SQLite 3.x

具体版本:每个 Python 版本会捆绑一个固定版本的 SQLite 引擎。你可以通过 sqlite3 模块来查询当前绑定的 SQLite 版本。可以通过以下代码查询当前 Python sqlite3 模块所绑定的 SQLite 版本:

import sqlite3print(sqlite3.sqlite_version)

输出结果将显示当前 sqlite3 模块使用的 SQLite 引擎版本。例如,可能会显示 3.35.5 或其他版本。

​004 在DB Browser for SQLite 中创建一个新的 SQLite 数据库

  1. 打开 DB Browser for SQLite工具

  2. 点击 "文件" 菜单中的 "新建数据库",或者直接按 Ctrl+N

选择一个存储位置并为新数据库指定一个文件名(例如:my_database.db),然后点击 "保存"

  1. 在点击"保存"后自动弹出如下画面,以便创建一个表来存储数据。按照以下步骤操作:

  2. 在弹出的窗口中,输入表名(例如:users)并定义表的字段。

    • 输入字段名(例如:idnameage)。

    • 设置字段类型(例如:INTEGERTEXTINTEGER)。

    • 确定哪一个字段作为主键,通常你可以选择 id 作为主键并勾选 "主键"

    • 如果你希望 id 字段能自动递增(即每次插入一条新数据,id 会自动加 1),可以勾选 “自增”(在 id 那一行)。

6. 完成表结构定义后,点击 "确定" 保存表格。

7. 表格创建完毕后,你可以插入一些数据:

点击 "数据浏览" 标签,选择你刚创建的表(例如:users)。

在数据表界面中,点击 "插入一条新记录" 按钮。我点击了4次。

输入数据(例如:id = 1name = 'Alice'age = 30

8. 在 执行 SQL 里运行以下语句插入一些测试数据

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

因为 id 是自增的,所以不用写,SQLite 会自动生成 5、6。

9. 查看数据,执行:

SELECT * FROM users;

005 练习常见的 增删查改 (CRUD) SQL 语句

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


1️⃣ 插入数据(INSERT)

-- 插入一条新记录(id 会自动生成)
INSERT INTO users (name, age) VALUES ('HanMeiMei'22);

-- 一次插入多条记录
INSERT INTO users (name, age) VALUES
('LiLei'24),
('ZhangSan'35);



2️⃣ 查询数据(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 表中查询 所有字段(即整行数据)。

  • ORDER BY age DESC
    按照 age 字段进行排序,DESC 表示 降序排列(从大到小)。
    如果用 ASC,就是 升序(从小到大),默认就是 ASC。

-- 查询前3条数据
SELECT FROM users LIMIT 3;



3️⃣ 更新数据(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️⃣ 删除数据(DELETE)

⚠ 注意:DELETE 会真正删除数据,不可撤销。

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

-- 删除年龄大于50的用户
DELETE FROM users WHERE age >50;
-- 删除所有记录(表还在,但数据全没了)
DELETE FROM users;

006 在Python代码中实现以上操作

用标准库 sqlite3在本地创建 SQLite 数据库文件,并完成:建库/建表 → 插入数据 → 查询 → 更新 → 删除,全流程示例。

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

2.插播基础知识回顾:

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

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

  • [] 定义了一个 列表(list)

  • 列表是 Python 里最常用的数据类型之一:

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

    • 可变(可以增删改元素)。

    • 可以存放不同类型的元素


2. 在这个例子里

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

  • 最外层的 [...] → 表示这是一个 列表

  • 列表里有两个元素:

    • (1, 'Alice', 25) → 一个元组

    • (2, 'Bob', 30) → 另一个元组

也就是说,这是一个 “元组的列表”

3.开始写程序了:

函数1def connect(db_path: Path) -> sqlite3.Connection:


注意connect 只是我定义的一个方法,后面会将具体的DB_PATH(数据库文件的文件路径对象)传给(赋值)db_path,也就是给到sqlite3.connect()。

sqlite3.connect(db_path)会:打开一个数据库文件(路径由 db_path 指定)。
如果这个文件不存在,会自动创建一个新的数据库文件。
返回一个 数据库连接对象,类型是 sqlite3.Connection


接下来我们要理解conn.row_factory = sqlite3.Row这句代码的作用,不要这句代码行不行?

  • row_factory=None → 返回元组

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

  • row_factory=dict_factory → 返回字典



函数2def reset_schema(conn: sqlite3.Connection):

函数reset_schema:重置数据库表:如果反复运行脚本,先删表再建表,避免报错
使用 executescript 方法一次执行多条 SQL

conn.commit()提交事务,把上面创建表结构的更改真正写入数据库

这两句 SQL:

DROPTABLE IF EXISTS orders;
DROPTABLE IF EXISTS users;


逐句解释

  1. DROP TABLE
    “删除一张表”。执行后,这张表里的数据和表结构都会被移除。

  2. IF EXISTS
     “如果存在的话才删除”。

    • 有表 → 删除成功。

    • 没表 → 什么都不做,也不会报错。

  3. orders / users
    表的名字。


为什么先删 orders 再删 users

因为 orders 里可能有外键引用 users,如果先删 users,会报错。所以顺序是:先删子表(orders),再删父表(users)


这两句 SQL 的意思就是: 把旧的订单表和用户表都删掉(如果它们存在的话),以便重新创建新的表结构。

函数3def seed_data(conn: sqlite3.Connection):

插入演示数据: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)暂时没有订单。


联表查询(谁买了什么)

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 一一对应,有两层办法:


1. 外键约束(Foreign Key Constraint) ✅ 最常用的方法

建表时这样写:

解释:

  • FOREIGN KEY (user_id):声明 user_id 是外键。

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

  • 效果:

  • 不能插入不存在的 user_id


    1. 如果删除了某个用户,ON DELETE CASCADE 会自动删除该用户的订单,避免出现“孤儿订单”。

⚠️ 注意:SQLite 默认 外键是关闭的,要显式打开:

PRAGMA foreign_keys =ON;


2. 应用层控制(编程时检查)

在 Python 里,下单前先检查用户是否存在:



  • orders表的user_id就是从users表的id来的

函数4def query_examples(conn: sqlite3.Connection):

常见查询示例:全表
常见查询示例:条件、关联
常见查询示例:聚合、排序

每行在做什么

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

  • 选出用户名称 u.name,并对其订单金额 o.price求和

  • SUM(...) 是聚合函数,会把同一组(见 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)按外键关系联结:o.user_id = u.id

  • 联结后,每一行订单都带上了对应的用户信息。

  1. GROUP BY u.id, u.name

  • 按 用户进行分组聚合(同一个用户的多条订单归为一组)。

  • 这里同时写 u.id, u.name 是更稳妥的写法:

    • u.id 唯一标识用户,避免同名不同人的混淆;

    • u.name 也在 GROUP BY 里,保证 SQL 标准兼容性。

  1. ORDER BY total_spent DESC

  • 按总消费额从高到低排序,谁花得多排在前面。

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

  • 取出所有结果行;
    -(若设置了 conn.row_factory = sqlite3.Row)把每行转成字典,再美观打印。

常见查询示例:条件+排序+限制条数
假设 users 表数据:
id
name
age
1
Alice
25
2
Bob
30
3
Charlie
35

执行查询后结果:

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

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

  • 限制:最多 5 条 → 实际只有 2 条

最终打印:

函数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 的用户邮箱统一改为 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'}]

函数6def delete_examples(conn: sqlite3.Connection):

-- 删除用户 Charlie(其订单将被级联删除):

Charlie 删除前的订单条数:0

Charlie 删除后的订单条数:0

-- 剩余用户:

[{'age': 26, 'id': 1, 'name': 'Alice'}, {'age': 30, 'id': 2, 'name': 'Bob'}]


函数7def create_indexes(conn: sqlite3.Connection):

创建索引

查询现有索引

函数8def main():


OverOver!


阅读原文:原文链接


该文章在 2025/10/18 11:17:59 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved