SQLite
version: 3.44.0
- SQLite 通过文件来保存数据库,一个文件就是一个数据库
commands
# archlinux install sqlite
sudo pacman -S sqlite
# ubuntu
sudo apt install sqlite3
# 打开一个已经存在的数据库
sqlite3 /var/lib/enx-api/enx.db
# 启动 sqlite
sqlite3
# 列出数据库文件和名字
.databases
# query schema, 列出所有的表
.table
# 查看表结构, 注意, 表名后面没有分号
.schema table0
# 创建数据库
sqlite3 /data/rssx/rssx.db
# insert data
insert into table_0 (name) values ('foo');
CREATE TABLE if not exists table_1 (name varchar(50) collate nocase PRIMARY KEY, create_time timestamp DEFAULT NULL);
insert into table_1 (name) values ('foo');
insert into table_1 (name) values ('Foo'); -- Runtime error: UNIQUE constraint failed: table_1.name (19)
# help
.help
# show tables
.tables
# insert
# alter table, rename
alter table feed
rename to feeds;
-- query that returns the size of a table in a SQLite database
-- 空表的 size 是 4096
select sum("pgsize") from "dbstat" where name='table0';
-- drop table
drop table table0;
SQLite,是一种轻型的数据库,是遵守 ACID 的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它, 它占用资源非常地低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持 Windows/Linux/Unix 等等主流的操作系统, 同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起 MySQL、PostgreSQL 这两款开源世界著名的数据库管理系统来讲, 它的处理速度比他们都快。SQLite 第一个Alpha 版本诞生于2000年5月。 至今已经有12个年头,SQLite 也迎来了一个版本 SQLite 3 已经发布。
SQLite vs DuckDB 对比
核心定位差异
SQLite
- 定位: OLTP (事务处理) 数据库
- 设计目标: 嵌入式、高并发写入、数据持久化
- 典型场景: 应用程序数据存储、移动应用、IoT 设备、浏览器存储
DuckDB
- 定位: OLAP (分析处理) 数据库
- 设计目标: 快速分析查询、列式存储、内存计算
- 典型场景: 数据分析、数据科学、BI 报表、日志分析
性能特点对比
| 特性 | SQLite | DuckDB |
|---|---|---|
| 存储方式 | 行式存储 (Row-oriented) | 列式存储 (Column-oriented) |
| 查询类型 | 事务查询 (OLTP) | 分析查询 (OLAP) |
| 写入性能 | 优秀 (支持高并发写入) | 一般 (批量写入较好) |
| 读取性能 | 点查询快 | 聚合分析快 (扫描大量数据) |
| 并发模型 | 多读单写 | 主要为单用户设计 |
| 内存占用 | 极低 (KB 级别) | 较高 (优化内存计算) |
功能特性对比
查询能力
-- SQLite: 基础 SQL 支持
SELECT * FROM users WHERE age > 18;
-- DuckDB: 强大的分析函数
SELECT
date_trunc('month', create_time) as month,
count(*) as user_count,
percentile_cont(0.95) WITHIN GROUP (ORDER BY age) as p95_age
FROM users
GROUP BY month
WINDOW w AS (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW);
数据类型
- SQLite: INTEGER, REAL, TEXT, BLOB, NULL (动态类型)
- DuckDB: 丰富类型支持 - ARRAY, STRUCT, MAP, JSON, UUID, TIMESTAMP WITH TIME ZONE
数据导入导出
-- SQLite: 有限的导入导出
.mode csv
.import file.csv table_name
-- DuckDB: 原生支持多种格式
COPY users TO 'output.parquet' (FORMAT PARQUET);
SELECT * FROM 'data.parquet';
SELECT * FROM 'data.json';
SELECT * FROM read_csv_auto('*.csv');
使用场景建议
选择 SQLite 的场景
- 需要嵌入式数据库的应用程序
- 移动应用 (iOS/Android)
- 浏览器本地存储 (Web SQL)
- 配置文件、缓存存储
- 小型 Web 应用的持久化层
- 频繁的增删改操作
选择 DuckDB 的场景
- 数据分析和数据科学项目
- 需要处理 CSV/Parquet/JSON 等文件
- 复杂的聚合和统计查询
- 替代 Pandas 进行大数据集分析
- BI 工具的嵌入式分析引擎
- 数据管道中的 ETL 转换
性能基准示例
场景: 分析 1000 万行数据
-- 查询: 按月统计用户数并计算平均值
SELECT
strftime('%Y-%m', create_time) as month,
COUNT(*) as total,
AVG(score) as avg_score
FROM users
GROUP BY month;
- SQLite: ~30-60 秒 (行式扫描,读取所有列)
- DuckDB: ~1-3 秒 (列式存储,只读需要的列)
场景: 单条记录插入
INSERT INTO users VALUES ('uuid', 'name', 'email', 'password', NOW());
- SQLite: ~0.1 毫秒 (优化的 OLTP 性能)
- DuckDB: ~0.5 毫秒 (非优化场景)
生态系统对比
SQLite
- 语言绑定: 几乎所有主流语言 (C, Python, Java, Go, Rust, JavaScript…)
- 工具支持: DB Browser for SQLite, Datasette, Litestream
- 社区: 成熟稳定,超过 20 年历史
DuckDB
- 语言绑定: Python, R, Java, Node.js, Go, Rust, C++
- 工具支持: DBeaver, 与 Pandas/Arrow 深度集成
- 社区: 快速增长,现代化设计
组合使用场景
在某些项目中,可以同时使用两者:
import sqlite3
import duckdb
# SQLite 用于事务数据
sqlite_conn = sqlite3.connect('app.db')
sqlite_conn.execute("INSERT INTO orders VALUES (...)")
# DuckDB 用于分析
duck_conn = duckdb.connect()
duck_conn.execute("""
SELECT date_trunc('day', order_time) as day,
SUM(amount) as revenue
FROM sqlite_scan('app.db', 'orders')
GROUP BY day
""")
总结
- SQLite: 久经考验的嵌入式 OLTP 数据库,适合事务处理和应用数据存储
- DuckDB: 现代化的嵌入式 OLAP 数据库,适合数据分析和复杂查询
- 不是替代关系: 两者解决不同问题,可以根据场景选择或组合使用
sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name
ON table-name ( column-name [, column-name]* )
建表
CREATE TABLE IF NOT EXISTS users (
id char(36) PRIMARY KEY NOT NULL,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL,
create_time timestamp NOT NULL
);
-- 建表
CREATE TABLE if not exists table_0 (id char(36) PRIMARY KEY NOT NULL, name varchar(50) DEFAULT NULL, create_time timestamp DEFAULT NULL);
CREATE TABLE if not exists table_0 (name varchar(50) PRIMARY KEY, create_time timestamp DEFAULT NULL);
CREATE UNIQUE INDEX IF NOT EXISTS index_user_name on users (name);
CREATE INDEX IF NOT EXISTS index_user_email ON users (email);
CREATE TABLE IF NOT EXISTS comment(
id INTEGER AUTO_INCREMENT NOT NULL,
content VARCHAR(300) NOT NULL,
user_id char(36) NOT NULL,
create_time timestamp NOT NULL,
update_time timestamp NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS tree_path(
parent INTEGER NOT NULL,
child INTEGER NOT NULL,
PRIMARY KEY (parent, child)
);
INSERT INTO users VALUES ('c31f5e0e-0e0c-4731-97dc-9c6675a0068c','admin','admin@admin.com','$2a$10$AR7t1b/kgGS2oiTrlrW2C.JkVAOT3ZviKj.2zvWZIm0lBnsOrTuX2', now())
https://www.runoob.com/sqlite/sqlite-create-table.html http://shows.poorren.com/Document/SQLite/39.Html
索引 B 树
https://blog.csdn.net/jinking01/article/details/115725022
https://www.sqlite.org/cli.html
在 windows 环境使用 sqlite
- install
https://www.sqlite.org/download.html
需要下载两个包: sqlite-dll-win-x64-3440000.zip, sqlite-tools-win-x64-3440000.zip, 解压之后把所有文件都放到同一个目录, 比如: C:\workspace\apps, 把这个目录加到环境变量 PATH.