ITPUB

SQLite3 打败了 PostgreSQL ——世界最大装机量数据库,低调但不小众

题目是SQLite打败了PostgreSQL,是的的确在我的这个目前的工作环境,完败。公司的PostgreSQL的实例不多10万多个实例,对你没有听错10万多。线下终端全部是PostgreSQL,不过马上就要改朝换代了,SQLlite是新的研究对象了,好了单位的机密就不能继续说了,还是说技术吧。
SQLite 和PostgreSQL比功能,计算能力,应用场景,SQLlite就是一个菜鸡,但是要比数量,使用的人数,适应的场景,PostgreSQL完败。
SQLite这个数据库起初也是一个企业因为没有合适的线下终端数据库,而自己研发的一款数据库,目的就是嵌入式。他的起源是2004年,3.0到了2025年他已经发展到了3.51版本,而这些版本之间的不同和操作系统是有关系的。
为什么要搞清楚版本的问题,主要是每个sqllite的版本和操作系统之间的关系非常紧密,不同的SQLITE提供的功能和能力与本身和操作系统密切相关。

https://www.sqlite.org/src/taglist

📅 软件版本发布与操作系统版本推测表

Tag Name
Most Recent Release Date (YYYY-MM-DD)
macOS Version (Approx.)
Windows Version (Approx.)
Linux Kernel (Approx.)
Ubuntu LTS (Approx.)
Rocky Linux (Approx.)
Android Version (Approx.)
major-release2025-11-04
16 (TBD)
11/12
6.x
24.04/25.10
10/11
15/16
version-3.51.02025-11-04
16 (TBD)
11/12
6.x
24.04/25.10
10/11
15/16
version-3.42.12025-08-06
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.44.52025-07-24
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.50.42025-07-30
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.50.32025-07-17
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.50.22025-06-28
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.50.12025-06-06
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.50.02025-05-29
15 (TBD)
11/12
6.x
24.04/25.10
10
15
version-3.49.22025-05-07
14 (Sonoma)
11/12
6.x
24.04 (LTS)
9/10
15
patch-release2025-02-19
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.49.12025-02-18
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.49.02025-02-06
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.48.02025-01-14
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.47.22024-12-07
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.47.12024-11-25
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.47.02024-10-21
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.46.12024-08-13
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.46.02024-05-23
13 (Ventura)
11
6.x
24.04 (LTS)
9/10
14
version-3.45.32024-04-15
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.44.32024-04-05
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.45.22024-03-12
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.45.12024-01-30
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.45.02024-01-15
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
14
version-3.44.22023-11-24
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.44.12023-11-22
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.44.02023-11-01
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.43.22023-10-10
14 (Sonoma)
11
6.x
22.04 (LTS)
9/10
14
version-3.43.12023-09-11
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
13
version-3.43.02023-08-24
13 (Ventura)
11
6.x
22.04 (LTS)
9/10
13
version-3.42.02023-05-16
13 (Ventura)
10/11
6.x
22.04 (LTS)
9/10
13
version-3.41.22023-03-22
13 (Ventura)
10/11
6.x
22.04 (LTS)
9
13
version-3.41.12023-03-10
13 (Ventura)
10/11
6.x
22.04 (LTS)
9
13
version-3.41.02023-02-21
13 (Ventura)
10/11
6.x
22.04 (LTS)
9
13
version-3.40.12022-12-28
13 (Ventura)
10/11
5.x/6.x
22.04 (LTS)
9
13
version-3.40.02022-11-16
13 (Ventura)
10/11
5.x/6.x
22.04 (LTS)
9
13
version-3.39.42022-09-29
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.39.32022-09-05
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.39.22022-07-21
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.39.12022-07-13
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.39.02022-06-25
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.38.52022-05-06
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.38.42022-05-04
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.38.32022-04-27
12 (Monterey)
10/11
5.x
22.04 (LTS)
9
12
version-3.38.22022-03-26
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.38.12022-03-12
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.38.02022-02-22
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.37.22022-01-06
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.37.12021-12-30
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.37.02021-11-27
12 (Monterey)
10/11
5.x
20.04 (LTS)
8/9
12
version-3.36.02021-06-18
11 (Big Sur)
10
5.x
20.04 (LTS)
8/9
11
version-3.35.52021-04-19
11 (Big Sur)
10
5.x
20.04 (LTS)
8
11
version-3.35.02021-03-12
11 (Big Sur)
10
5.x
20.04 (LTS)
8
11
version-3.34.12021-01-20
11 (Big Sur)
10
5.x
20.04 (LTS)
8
11
version-3.34.02020-12-01
11 (Big Sur)
10
5.x
20.04 (LTS)
8
11
version-3.33.02020-08-14
10.15 (Catalina)
10
5.x
20.04 (LTS)
8
10
version-3.32.02020-05-22
10.15 (Catalina)
10
5.x
20.04 (LTS)
8
10
version-3.31.02020-01-22
10.15 (Catalina)
10
5.x
18.04 (LTS)
8
10
version-3.30.02019-10-04
10.14 (Mojave)
10
5.x
18.04 (LTS)
8
10
version-3.29.02019-07-10
10.14 (Mojave)
10
4.x/5.x
18.04 (LTS)
8
9 (Pie)
version-3.28.02019-04-16
10.14 (Mojave)
10
4.x/5.x
18.04 (LTS)
8
9 (Pie)
version-3.27.02019-02-07
10.14 (Mojave)
10
4.x
18.04 (LTS)
7/8
9 (Pie)
version-3.26.02018-12-01
10.14 (Mojave)
10
4.x
18.04 (LTS)
7/8
9 (Pie)
version-3.25.02018-09-15
10.13 (High Sierra)
10
4.x
18.04 (LTS)
7/8
8 (Oreo)
version-3.24.02018-06-04
10.13 (High Sierra)
10
4.x
18.04 (LTS)
7
8 (Oreo)
version-3.23.02018-04-02
10.13 (High Sierra)
10
4.x
16.04 (LTS)
7
8 (Oreo)
version-3.22.02018-01-22
10.13 (High Sierra)
10
4.x
16.04 (LTS)
7
8 (Oreo)
version-3.21.02017-10-24
10.13 (High Sierra)
10
4.x
16.04 (LTS)
7
7 (Nougat)
version-3.20.02017-08-01
10.12 (Sierra)
10
4.x
16.04 (LTS)
7
7 (Nougat)
version-3.19.02017-05-22
10.12 (Sierra)
10
4.x
16.04 (LTS)
7
7 (Nougat)
version-3.18.02017-03-28
10.12 (Sierra)
10
4.x
16.04 (LTS)
7
7 (Nougat)
version-3.17.02017-02-13
10.12 (Sierra)
10
4.x
16.04 (LTS)
7
7 (Nougat)
version-3.16.02017-01-02
这个部分我看完也有点懵,怎么版本号低的在后面版本号高的在前面,是的就是这样官方文档就是这样。
SQLite 版本
主要发布时间
操作系统支持特性
说明
3.0 (2004)
POSIX, Windows NT/2000
初代 B-tree 引擎
启动现代 SQLite 时代
3.6.x (2008)
Linux 2.4+, Windows XP
引入 WAL 模式
依赖可靠的文件锁机制
3.7.x (2010)
Linux, macOS, Windows 7
WAL 默认稳定
支持 mmap()
3.8.x (2013)
Linux 3.x+, macOS 10.9+, Android 4+
Query planner 改进
引入 partial index、covering index
3.9~3.15 (2015–2016)
主流 Linux, macOS, Windows 10
支持 JSON1 扩展
UTF-8 全面兼容
3.24+ (2018)
Linux 4+, Android 8+, macOS 10.13+
支持 UPSERT
更好的并发性能
3.33+ (2020)
Linux 5+, Windows 10+, iOS 14+
支持大于 2GB 的数据库文件
改进文件系统同步
3.39+ (2022)
Linux, macOS, Android 12+
支持 STRICT 表模式
更适合现代移动端
3.45+ (2024)
Linux 6+, macOS Sonoma, Android 14
JSON5, decimal precision 改进
最新稳定版系列
macOS 版本
内置 SQLite 版本
10.15 (Catalina)
3.28
11 (Big Sur)
3.32
12 (Monterey)
3.35
13 (Ventura)
3.38
14 (Sonoma)
3.45
Android 版本
API Level
内置 SQLite 版本
7 (Nougat)
24
3.14
8 (Oreo)
26
3.18
9 (Pie)
28
3.22
10 (Q)
29
3.28
11 (R)
30
3.32
12 (S)
31
3.35
13 (T)
33
3.38
14 (U, 2024)
34
3.45
iOS 版本
SQLite 版本
iOS 13
3.28
iOS 14
3.32
iOS 15
3.35
iOS 16
3.39
iOS 17
3.45
我目前得出的结论是3.45这个版本会比较适合,原因也很简单。这个版本的可以兼容大部分的现在流行的操作系统,同时也不会特别的落后,特别新的操作系统就算了,行业的原因,这里不解释。
下一步就是安装,这里现找到的就是LINUX下的编译安装在编译安装时遇到一个问题,就是tcl 测试环境的问题,这里查询可以将这个不进行编译。
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
echo'#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c
cat sqlite3.c >>tclsqlite3.c
echo'#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c
cat /data/sqllite345/src/tclsqlite.c >>tclsqlite3.c
tclsh8.6 /data/sqllite345/tool/buildtclext.tcl --destdir "" --cc "gcc" -g -O2 -DSQLITE_OS_UNIX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS  
can't read "@": no such variable
    while executing
"subst $cmd"
    invoked from within
"if {$tcl_platform(platform)=="windows"} {
  # We are only able to install, uninstall, and list on Windows.
  # The build process is handled by the Mak..."
    (file "/data/sqllite345/tool/buildtclext.tcl" line 69)
make: *** [Makefile:1603: tclextension-install] Error 1

编译时./configure --disable-tcl 去掉tcl测试环境,在进行make make install就可以了,版本3.45 Rocky linux 8.10

Sqlite 架构
Sqlite 架构
Sqllite 由两个部分组成,一个是主体,另一个是测试单元,在编辑的时候我们抛弃的也就是测试的单元,测试单元与数据库没有必然的联系,从图中也可以看出。
下面开始是快速的对一些我们感兴趣的问题进行快速的梳理:
1 并发的问题,在PG上并发那不是问题,对于sqlite来说,按就是一个大问题,sqlite有两种模式,rollback-journal 和 wal模式,这个是通过命令PRAGMA journal_mode = WAL; 来控制的那么这两个模式有什么区别,一句话rollback-journal 模式会产生 读 和 写的 库锁,你没有看错,库锁。 wal 模式会产生 多读 并发,和多写的库锁。
2 在测试中很容易就会出现数据库的锁,测试的方法也很简单,两个SQL然后批量进行运行,测试分为 reader.sql  writer.sql 读写的操作,然后还有一个sh 脚本,来调用
#!/bin/bash

for i in {1..50}; do
whiletrue; do
    sqlite3 /data/data/test.db < /data/data/writer.sql
done &
done

# 50 并发查询
for i in {1..50}; do
whiletrue; do
    sqlite3 /data/data/test.db < /data/data/reader.sql
done &
done

SELECT count(*)
FROM test_data
WHERE value > (abs(random() % 50000));
BEGIN TRANSACTION;
INSERT INTO test_data (name, value)
VALUES ('writer_' || random(), abs(random() % 100000));
COMMIT;
在测试中一开始就产生了大量的database locks
数据库锁
数据库锁
qllite 是世界装机量最大的数据库,这会在我们这边也要被印证了。接着说下为什么SQLite 打败了PostgreSQL.
我们先从安装说起,PG和SQLite都需要编译,但从功能上来讲,极简的数据库产品SQLite特很小。当然这并不能成为在移动端打败PostgreSQL的根本,而在使用中那种无需数据库初始化,数据库程序没有配置文件,数据库加载数据文件非常方便,只需要sqlite 数据文件名即可。

编辑后的SQLite

编辑后的SQLite
快速加载数据库文件
快速加载数据库文件
而这样一个数据库产品他是有日志的,也就是类似pg的wal日志的,他也有类似的begin commit 等功能,但省去了数据库初始化,以及一堆的关联的文件,这对移动端的友好性,不是PostgreSQL可比的。
维度
SQLite
PostgreSQL
运行模式
嵌入式(库内嵌)
客户端/服务器架构
进程模型
无服务进程,直接运行在应用进程内
独立守护进程 postmaster
部署方式
拷贝一个文件即可运行
需初始化、监听端口、用户认证
依赖
零依赖(C 库)
依赖操作系统用户、网络栈、配置文件
典型使用场景
移动端、嵌入式、边缘端
服务器、大数据、OLTP/OLAP
在版本升级上,我也发觉了,我分析了一下版本的更新非常快,2到3个月就有版本的patch和更新。

而从一个合格的移动端的数据库来说,系统资源的占用是一个关键,你的应用产品需要部署到各个地方,可能是台式,笔记本,PAD,手机,或者智能硬件上,所以SQLite更有能力这里我们做一个环境上的总结。

指标
SQLite
PostgreSQL
二进制体积
< 1MB
> 30MB(最小安装)
内存占用
约 512KB–2MB
启动即占用 > 20MB
CPU 唤醒
无后台线程
守护 + WAL writer + checkpointer
磁盘结构
单文件(含元数据与表)
多文件(每表、每索引独立)
所以我对SQLite的定义是一个如U盘的数据库,数据库的程序和文件,只需要一个U盘就可以随便去哪里,进行计算和数据存储。
项目
SQLite
PostgreSQL
连接启动
内存函数调用(μs 级)
TCP 握手 + 认证(ms 级)
首次查询延迟
< 1ms
20–100ms(含连接建立)
并发访问
多线程/多进程内共享
每连接独立后台进程
断电恢复
单文件 + WAL
需后台进程恢复日志
而SQLite 付出的代价也是显而易见的,下面的额这些没有如果是在服务器端的数据库产品是无法被容忍的,而在移动端的数据库产品,那是太好不过了。
层
PostgreSQL
SQLite
网络层
TCP/IP + SSL + libpq
❌ 无
认证层
用户/密码/角色
❌ 无(文件访问即授权)
进程层
postmaster + backend
❌ 无(函数调用)
存储引擎
shared_buffers + bgwriter
简单 B-tree + WAL 文件
配置
postgresql.conf + pg_hba.conf
❌ 无配置文件
而这样一个SQLite,也是具备持久事务保证(fsync),原子性,崩溃恢复机制,以及过渡单写的能力。
场景
SQLite 3.45 (WAL)
PostgreSQL 16 (local)
单线程插入 10 万行
0.9 秒
3.8 秒
随机读取 10 万行
0.15 秒
0.21 秒
启动 + 查询一条记录
1.2 ms
48 ms
断电恢复后可用
✅ 立即
⚠️ 需 WAL replay
所以写到这里,没有万能的数据库,只有和适用场景贴近的数据库产品,PG非常好,但在移动端上,SQLite 才是王者。
但这里需要补一句,在移动端我们多年的实践经验,其实Postgresql 还是很不错的,(不要和我提mysql 那个根本不靠谱,你连商用的资格都没有)。

维度
SQLite 胜因
PostgreSQL 劣势
启动
零配置、内嵌加载快
需进程启动
性能
函数级调用、低延迟
网络调用、多进程开销
部署
单文件即可
需初始化和管理
能耗
无守护进程
常驻后台线程
离线
原生支持
需额外缓存层
兼容
原生支持移动端
不适合移动端嵌入

接下来咱们继续学习SQLite,我们对一些简单的SQLite的命令进行简单的学习。

SQLite 作为轻量级的数据库,其数据库类型体系与传统的数据类型差异是很签注的额,从数据库类型上看,他的主要核心是围绕动态类型,和兼容类型他的数据类型并不精准,而是围绕灵活性而来。

SQLite的第一个区别就是动态类型,比如我们PostgreSQL中INT,我们只能存储数据类型,而SQLite不是的,即使你声明的表类型是INT,他也可以存储字符串类型,浮点等,列定义仅仅作为参考,不做强制。

后面在SQLite中又有strict表,这类表才是严格和传统数据库类型强制一致的表,如果有此类需求需要建表的时候建立strict表。

SQlite的数据类型主要有五种,NULL, INTEGER ,REAL, TEXT, BLOB 等,这里SQLite里面是没有时间类型的,时间类型需要转化,通过date, strftime函数来进行。

日期时间类型:无独立存储类,需通过以下 3 种格式存储,再用内置日期函数(如 date()、strftime())转换:

TEXT:ISO8601 格式(如 2024-11-14 12:00:00); REAL:儒略日(自公元前 4714 年 11 月 24 日格林威治正午起的天数); INTEGER:Unix 时间戳(自 1970-01-01 00:00:00 UTC 起的秒数)

这里需要注意如果建立不同表,那么你输入的类型如果是5.0 会自动转化为 5整型,而不是浮点类型 real。

可能是随着SQLite使用的越来越多,作为移动端的数据越来越重要,那种数据库把你的数据类型转错的情况就发生了,所以后续的SQLite有新的一个表类型strict,建立表需要建表的末尾添加strict 也就是严格模式。

列类型强制要求

所有列必须显式指定类型,不能省略; 仅允许 6 种类型:INT、INTEGER、REAL(浮点)、TEXT(字符串)、BLOB(二进制)、ANY(任意类型),无其他可选类型(未来可能新增)。

(2)数据插入规则

非ANY类型列:插入数据需是NULL(无NOT NULL约束时)或匹配列类型;SQLite 会按 “类型亲和性规则” 尝试转换(与其他数据库一致),无法无损转换则抛出SQLITE_CONSTRAINT_DATATYPE错误(例:INTEGER列插入'xyz'会报错)。 ANY类型列:可接受任意类型数据(NOT NULL约束时拒绝NULL),不做任何类型转换,完全保留原始数据类型与值。

(3)主键与完整性检查

主键列隐式包含NOT NULL约束;但INTEGER PRIMARY KEY列插入NULL时,会自动转为唯一整数(与非严格表规则一致)。 PRAGMA integrity_check/quick_check命令会检查 STRICT 表的列类型,异常时提示错误。

(4)与非严格表的共性 除上述差异外,STRICT 表的其他特性与普通表完全一致,包括:CHECK/NOT NULL/FOREIGN KEY/UNIQUE约束、DEFAULT/COLLATE子句、生成列、ON CONFLICT处理、索引、AUTOINCREMENT、INTEGER PRIMARY KEY作为rowid别名、磁盘存储格式等。

  1. ANY 数据类型:特殊规则 设计目的:在严格模式下,仍支持 “单列存储任意类型数据” 的灵活能力(SQLite 独有特性)。

STRICT 表 vs 非严格表的差异: STRICT 表的ANY列:完全保留原始数据(例:插入'000123',存储为text类型的'000123'); 非严格表的ANY列:会尝试将 “类数字字符串” 转为数值(例:插入'000123',存储为integer类型的123)。

  1. 向后兼容性

(1)版本限制 仅 SQLite 3.37.0 及以上版本能识别STRICT关键字;低版本打开含STRICT表的数据库时,默认报错(除特殊情况外)。 不含STRICT表的数据库,3.37.0 及以上版本创建后,仍可被低至 3.0.0(2004 年)的版本读写。

(2)低版本访问 STRICT 表的特殊方式 低版本可通过打开数据库后立即执行PRAGMA writable_schema=ON(关闭 schema 解析错误),忽略STRICT关键字并读写表,但不会触发严格类型检查(可能导致数据类型错误,需用高版本PRAGMA quick_check检测)。 SQLite CLI 的.dump命令默认启用writable_schema=ON,低版本用.dump可读写 STRICT 表,但同样存在数据损坏风险。

  1. 其他表选项 CREATE TABLE语句末尾(闭合括号后)可接逗号分隔的表选项,目前仅支持 2 种: STRICT(严格类型)、WITHOUT ROWID(无rowid表); 选项顺序不限,当前版本允许重复选项(未来可能取消,不建议依赖)。

所以针对业务,希望开发人员在3.37版本后的SQLite应该这对业务中的一些精确的数字,或者数字就是文字的部分应该严格,建表就要建立一个严格的表。

建立一个复杂的表
建立一个复杂的表

CREATE TABLE orders (order_id  INTEGER PRIMARY KEY,order_no TEXT NOT NULL UNIQUE,customer_id  INTEGER NOT NULL,amount REAL NOT NULL,pay_type  TEXT CHECK(pay_type IN ('CARD','CASH','WALLET')),created_at TEXT NOT NULL,raw_payload  ANY,note TEXT,FOREIGN KEY (customer_id) REFERENCES customers(id)) STRICT;

SQLite 并不需要启动,你可以认为他是一个程序,通过SQLite 数据库文件名,就可以进入到数据库进行操作。

查看系统的版本 sqlite> .version SQLite 3.47.1 2024-11-25 12:07:48 b95d11e958643b969c47a8e5857f3793b9e69700b8f1469371386369a26e577e zlib version 1.2.11 gcc-8.5.0 20210514 (Red Hat 8.5.0-28) (64-bit) sqlite>

SQLite3
SQLite3

对Sqlite的日常命令不熟悉,可以通过.help进行更详细的命令的问询

对sqlite中的有多少表进行询问

查看有多少表使用 .table .schema 表名 查看表结构

sqlite> 
sqlite> .tables
id         test_data
sqlite> .schema test_data
CREATE TABLE test_data (
 id INTEGER PRIMARY KEY AUTOINCREMENT,
 name TEXT,
 value INTEGER,
 created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
sqlite> 
常见命令
常见命令
这里sqlite有自己的系统表结构,可以通过来进行查看
sqlite> select * from sqlite_master;
table|id|id|2|CREATE TABLE id (id int)
table|sqlite_sequence|sqlite_sequence|4|CREATE TABLE sqlite_sequence(name,seq)
table|test_data|test_data|3|CREATE TABLE test_data (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT,
  value INTEGER,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
Run Time: real 0.000 user 0.000020 sys 0.000039
具体我们查看表名前缀为test的表
查询特定前缀表
查询特定前缀表
这里遇到一个问题,在对表进行删除的过程中,发现报错
image

遇到此问题,目前最快速的方案是,退出SQLite然后在进入进行命令的操作。

总结: SQLite在我使用中,经常有database lock的错误产生,(因为我还是用传统数据库思维去操作的问题),解决也很简单,查杀链接,或把.quit数据库即可,解决库锁的问题。在操作中命令不支持上下箭头来进行历史命令的查找,建表要注意宽松模式和严苛模式,其实我逐步对SQLite的深入,我其实对他有很多的问题。

1 SQLLite数据支持数据压缩吗,因为我现在一个表,几百万的数据就270MB的文件大小了,说明这个数据库本身数据的文件的控制有问题,应该有可以进行碎片整理的命令,这个我看到了,但我还没有深入。

2 在研发中,使用SQLite3 如何进行开发和库表的使用,用传统数据库使用思路是一定不行的,还需要打破原有的设计思路来避免库锁的问题。

3 因为我曾经有一次服务器重启,然后进入SQLite特别慢的经历,说明断电对第一次SQLite启动是有阻碍的,应该是wal模式下数据在重做导致的,但是一个关键的问题,SQLite 没有日志,没有错误的报告等等,这些还需要研究。

Image