SQLite入门

星河1.webp

一、SQLite 核心定义

SQLite 是一款开源、嵌入式、无服务器的关系型数据库管理系统(RDBMS),也是目前世界上使用最广泛的数据库(几乎所有手机、桌面应用、嵌入式设备都内置了它)。

它的核心特征可以用一句话概括:整个数据库就是一个单一的磁盘文件,你的程序无需连接独立的数据库服务器,直接通过内置的 SQLite 库读写这个文件即可,无需安装、无需配置、无需维护。

二、SQLite 核心架构与工作原理

1. 核心架构(无服务器架构)

和 PostgreSQL/MySQL 的 “客户端 - 服务器(C/S)” 架构不同,SQLite 是 “嵌入式” 架构:

  • C/S 架构(如 PG):有独立的数据库服务器进程,程序作为客户端通过网络 / 本地协议连接服务器,由服务器处理所有数据操作。

  • 嵌入式架构(SQLite):SQLite 以库文件(如sqlite3.dll/sqlite3.so)的形式嵌入到你的程序中,程序直接调用库函数读写本地数据库文件,没有独立的 “服务器进程”。

2. 数据存储方式

  • 整个数据库的所有内容(表、数据、索引、视图、触发器等)都存储在单个文件中(后缀通常是.db/.sqlite)。

  • 这个文件可以直接复制、移动、备份,跨平台兼容(比如 Windows 下创建的.db文件,直接复制到 Linux/macOS 上就能用)。

  • 底层采用高效的二进制格式存储,比纯文本(如 CSV)读写更快、占用空间更小。

3. ACID 事务保障

SQLite 完全支持 ACID(原子性、一致性、隔离性、持久性),即使程序崩溃、断电,也能保证数据不损坏:

  • 原子性:事务要么全部执行,要么全部回滚。

  • 一致性:事务执行前后,数据库始终处于合法状态。

  • 隔离性:默认支持SERIALIZABLE隔离级别(最高级别),避免脏读、幻读。

  • 持久性:事务提交后,数据永久保存到磁盘。

三、SQLite 核心特性

1. 零配置 / 零运维

  • 无需安装:只需将 SQLite 的库文件引入项目,无需安装 “SQLite 服务器”。

  • 无需启动 / 停止服务:没有后台进程,程序运行时自动读写文件,退出后无残留。

  • 无需配置:不用设置端口、用户名、密码,直接通过文件路径访问数据库。

2. 轻量级

  • 库文件体积极小:Windows 下sqlite3.dll约 400KB,Linux 下libsqlite3.so约 500KB。

  • 内存占用低:运行时仅占用少量内存,适合嵌入式设备(如智能手表、路由器)。

  • 无依赖:独立库文件,不依赖其他系统组件。

3. 跨平台

支持几乎所有主流平台:

  • 桌面系统:Windows、macOS、Linux。

  • 移动端:Android、iOS(所有手机 APP 几乎都内置 SQLite)。

  • 嵌入式系统:ARM、MCU、路由器、智能家居设备。

  • 编程语言:Python、Java、C/C++、Go、JavaScript 等几乎所有语言都有原生 / 第三方库支持。

4. SQL 兼容性

支持大部分 SQL92 标准,满足日常开发需求:

  • 基础操作:SELECT/INSERT/UPDATE/DELETECREATE TABLE/DROP TABLE

  • 高级操作:JOIN(内连接 / 外连接)、GROUP BY/HAVINGORDER BY、索引(CREATE INDEX)。

  • 事务操作:BEGIN TRANSACTIONCOMMITROLLBACK

  • 局限性:不支持存储过程(新版有限支持)、自定义函数(需通过 API 扩展)、高级权限管理。

5. 权限控制

SQLite 本身没有 “用户 / 角色” 的概念,完全依赖操作系统的文件权限

  • 比如 Windows 下给.db文件设置 “只读” 权限,程序就只能查询不能修改。

  • 比如 Linux 下设置chmod 600 test.db,只有当前用户能访问。

四、SQLite 典型使用场景

1. 移动端应用(核心场景)

  • Android/iOS APP 的本地数据存储:比如微信的本地聊天记录、抖音的缓存视频信息、手机相册的元数据。

  • 原因:轻量、无需网络、本地读写速度快,适配移动端低资源环境。

2. 桌面应用

  • 小型工具软件:记事本、截图工具、密码管理器的配置 / 数据存储。

  • 大型软件的辅助存储:Photoshop 的历史记录、VS Code 的插件配置、浏览器的书签 / 历史记录。

3. 嵌入式设备

  • 智能手表、智能家居(如智能音箱)、路由器的本地数据存储。

  • 工业控制设备:采集传感器数据,本地存储后定时上传到云端。

4. 开发 / 测试场景

  • 原型开发:快速验证 SQL 逻辑、业务流程,无需搭建复杂的数据库服务器。

  • 单元测试:为测试用例提供独立的数据库环境,每个测试用例对应一个临时.db文件,测试完成后直接删除。

5. 小型 Web 应用

  • 个人博客、小型工具网站(低并发):比如单用户的博客后台,日访问量几千次的场景。

  • 注意:不适合高并发的 Web 应用(如电商网站)。

五、SQLite 优缺点分析

优点

  1. 极致易用:上手成本为 0,新手几分钟就能学会基本操作。

  2. 便携性强:单文件存储,复制即可迁移,无需考虑环境兼容。

  3. 性能优秀:小数据量(GB 级以内)、低并发下读写速度极快(无服务器开销)。

  4. 稳定可靠:经过 20 + 年的验证,是世界上部署最广泛的数据库,极少出现数据损坏。

  5. 免费开源:无商业授权费用,可自由用于个人 / 商业项目。

缺点

  1. 并发写能力差:写操作会锁定整个数据库文件,高并发写(如每秒几十次写)会导致严重卡顿。

  2. 大数据量受限:单文件超过 10GB 后,查询 / 写入性能明显下降(官方建议单文件不超过 2TB,但实际很少用到)。

  3. 功能有限:无集群 / 主从复制、无高级权限管理、无存储过程(新版仅有限支持)、无全文搜索(需扩展)。

  4. 无远程访问:默认只能本地访问,无法像 PG/MySQL 那样远程连接(需借助第三方工具如sqlite3server)。

六、SQLite 实际使用示例(Python)

下面是一个完整的示例,包含创建表、增删改查、事务、索引等常用操作:

python

运行

import sqlite3

# 1. 连接数据库(不存在则自动创建)
# :memory: 表示内存数据库,程序退出后数据消失,适合测试
# conn = sqlite3.connect(':memory:')
conn = sqlite3.connect('mydb.db')

# 启用行工厂:查询结果以字典形式返回(默认是元组)
conn.row_factory = sqlite3.Row

# 2. 创建游标(用于执行SQL语句)
cursor = conn.cursor()

try:
    # 3. 创建表
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自增主键
            name TEXT NOT NULL,                    -- 非空字符串
            age INTEGER,                           -- 整数
            email TEXT UNIQUE                      -- 唯一约束
        )
    ''')

    # 4. 创建索引(加速查询)
    cursor.execute('CREATE INDEX IF NOT EXISTS idx_users_name ON users(name)')

    # 5. 事务操作:批量插入数据
    conn.begin()  # 开启事务
    # 批量插入(避免循环执行INSERT,提升性能)
    users_data = [('张三', 25, 'zhangsan@test.com'), ('李四', 30, 'lisi@test.com')]
    cursor.executemany('INSERT INTO users (name, age, email) VALUES (?, ?, ?)', users_data)
    conn.commit()  # 提交事务

    # 6. 查询数据
    # 单条查询
    cursor.execute('SELECT * FROM users WHERE name = ?', ('张三',))
    user = cursor.fetchone()
    if user:
        print(f"单条查询结果:ID={user['id']}, 姓名={user['name']}, 年龄={user['age']}")

    # 多条查询
    cursor.execute('SELECT * FROM users ORDER BY age DESC')
    all_users = cursor.fetchall()
    print("\n所有用户:")
    for u in all_users:
        print(f"ID={u['id']}, 姓名={u['name']}, 邮箱={u['email']}")

    # 7. 更新数据
    cursor.execute('UPDATE users SET age = ? WHERE name = ?', (26, '张三'))
    conn.commit()

    # 8. 删除数据
    # cursor.execute('DELETE FROM users WHERE id = ?', (2,))
    # conn.commit()

except sqlite3.Error as e:
    # 出错时回滚事务
    conn.rollback()
    print(f"数据库操作出错:{e}")
finally:
    # 9. 关闭连接
    cursor.close()
    conn.close()

运行结果

plaintext

单条查询结果:ID=1, 姓名=张三, 年龄=25

所有用户:
ID=2, 姓名=李四, 邮箱=lisi@test.com
ID=1, 姓名=张三, 邮箱=zhangsan@test.com

七、SQLite 性能优化要点(新手必看)

  1. 开启 WAL 模式:提升并发读写性能(默认是 DELETE 模式,写锁整个文件)。

    python

    运行

    # 连接后立即执行
    cursor.execute('PRAGMA journal_mode = WAL')
    
  2. 批量操作:使用executemany()代替循环execute(),减少磁盘 IO 次数。

  3. 合理创建索引:对查询频繁的字段建索引,但不要建过多(会降低写入速度)。

  4. 避免长时间事务:事务开启后尽快提交 / 回滚,减少锁占用时间。

  5. 分页查询:大数据量查询时用LIMIT/OFFSET分页,避免一次性读取所有数据。

总结

  1. 核心定位:SQLite 是轻量级嵌入式数据库,核心优势是零配置、轻量、便携,适合单用户、低并发、小数据量的本地存储场景。

  2. 关键局限:并发写能力差、功能有限、不支持远程访问,不适合高并发的企业级应用。

  3. 使用技巧:开启 WAL 模式提升并发性能,批量操作减少 IO,合理建索引加速查询,是新手快速上手 SQL 的最佳选择之一。

每日科技新闻速览(2026-01-26) 2026-01-26
杨浦街头,开着灯的鸟窝 2026-01-26

评论区