Skip to content

SQLite - 概述

本指南提供了 SQLite 的现代概览,探讨了它在当代软件开发中的作用,以及它如何作为强大、轻量级的数据库解决方案脱颖而出。

SQLite 是一个 C 语言库,实现了一个小型、快速、自包含、高可靠性、功能齐全的 SQL 数据库引擎。与客户端-服务器数据库(如 MySQL 或 PostgreSQL)不同,SQLite 是无服务器的,直接嵌入到最终应用程序中。整个数据库(定义、表、索引以及数据本身)以单个跨平台文件的形式存储在主机上。

其源代码属于公共领域(public domain),因此可以免费用于任何目的,无论是商业还是个人用途。

  • 无服务器架构:无需单独的服务器进程进行安装、设置、配置、管理或故障排除。这简化了部署并降低了操作开销。
  • 零配置:SQLite 开箱即用。没有配置文件,也不需要进行管理任务。
  • 事务 ACID 合规性:即使在系统崩溃和断电后,事务也具备原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和持久性(Durable),这确保了数据完整性。
  • 移动和桌面应用程序:它是 Android、iOS(通过 Core Data)和 macOS 的原生数据存储引擎。非常适合使用 Electron 或 Tauri 等框架构建的桌面应用程序。
  • 本地优先和离线优先应用:通过将数据本地存储,然后在与中央服务器同步之前,确保应用程序在离线状态下也能可靠工作。
  • 原型设计与开发:对于最终将使用客户端-服务器数据库的较大型应用程序的开发和测试阶段而言,这是一个绝佳的选择。
  • 数据分析与缓存:用于分析中等规模的数据集,或作为从远程 API 获取数据的本地缓存。
  • 物联网(IoT)和边缘计算:其小巧的占用空间和高可靠性使其非常适合资源受限的设备。
  • 2000:D. Richard Hipp 创建了 SQLite 1.0。
  • 2013 (v3.8.0):引入了公共表表达式(Common Table Expressions, CTEs),这是一个用于编写可读、递归查询的强大功能。
  • 2015 (v3.9.0):添加了对 UPSERT (INSERT ON CONFLICT) 的支持。
  • 2018 (v3.25.0):添加了窗口函数(Window Functions),实现了复杂的分析查询。同时增加了 ALTER TABLE RENAME COLUMN 支持。
  • 2021 (v3.35.0):添加了 ALTER TABLE DROP COLUMN 支持。
  • 2022 (v3.39.0):最终添加了 RIGHT 和 FULL OUTER JOIN 支持,使 SQLite 的 JOIN 功能与其他主流数据库保持一致。
  • 2023+:持续的性能改进、JSON 函数增强以及持续的功能开发。

现代 SQLite 功能强大,但理解其设计理念至关重要。以下是对其功能的最新解读,旨在纠正一些过时的信息。

功能状态与现代实践
外部连接(Outer Joins)完全支持。LEFT、RIGHT 和 FULL OUTER JOIN 都已实现(自 v3.39.0 起)。“只支持 LEFT JOIN”的旧限制已不再成立。
ALTER TABLE大部分支持。RENAME TABLE、ADD COLUMN、RENAME COLUMN 和 DROP COLUMN 都支持。修改列的类型或约束仍然需要更复杂的迁移过程(创建新表、复制数据、删除旧表)。
可更新视图(Updatable Views)视图默认是只读的。但是,您可以在视图上创建 INSTEAD OF 触发器,以拦截 INSERT、UPDATE 或 DELETE 操作,并将逻辑应用于底层表,从而有效地使视图可更新。
用户管理(User Management)设计上不支持。SQLite 没有用户、GRANT 或 REVOKE 的概念。访问控制是在文件系统级别处理的(即,谁可以读取/写入数据库文件)。
触发器(Triggers)FOR EACH ROW 触发器得到全面支持。FOR EACH STATEMENT 触发器则不支持。这是一个蓄意的设计选择,符合大多数使用场景。

SQLite 使用标准的 SQL 命令,这些命令可以按功能分组:

  • 数据定义语言 (DDL):定义数据库模式。(CREATE TABLE、ALTER TABLE、DROP TABLE、CREATE INDEX)
  • 数据操作语言 (DML):用于添加、更新或删除数据。(INSERT、UPDATE、DELETE)
  • 数据查询语言 (DQL):用于检索数据。(SELECT 语句)
  • 事务控制语言 (TCL):管理事务以确保数据完整性。(BEGIN TRANSACTION、COMMIT、ROLLBACK)