# littledata **Repository Path**: srgnet/littledata ## Basic Information - **Project Name**: littledata - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-08 - **Last Updated**: 2026-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LittleData 🗄️ > **A PostgreSQL-inspired relational database engine written in pure Python** LittleData 是一个参照 PostgreSQL 内核架构设计、用纯 Python 实现的迷你关系数据库引擎,适合学习数据库原理、教学演示和嵌入式轻量级应用。 [](LICENSE) [](https://python.org) [](littledata.py) --- ## ✨ 核心特性 | 特性 | 说明 | |------|------| | **存储引擎** | 8 KB 固定页面,PageHeader + ItemPointer + TupleHeader(与 PG Heap 对齐) | | **缓冲池** | LRU 替换策略,支持 pin/unpin,脏页追踪与刷盘 | | **B+ 树索引** | 支持主键、唯一索引、普通索引,支持范围扫描 | | **WAL 预写日志** | 顺序追加写,CRC32 校验,支持崩溃恢复与 Checkpoint | | **MVCC** | 快照隔离级别,xmin/xmax 版本链,事务可见性判断 | | **SQL 解析器** | 手写递归下降解析器,零依赖 | | **类型系统** | INTEGER、BIGINT、FLOAT、TEXT、BOOLEAN、TIMESTAMP、JSONB | | **系统目录** | JSON 原子持久化(tmp + rename),支持多库多 schema | | **交互式 CLI** | 类 psql 的命令行客户端,支持 `\d`、`\l`、`\timing` 等元命令 | --- ## 📁 项目结构 ``` littledata/ ├── littledata.py # 交互式 CLI 客户端(类似 psql) ├── src/ │ ├── database.py # 数据库主入口,整合所有子系统 │ ├── storage/ │ │ ├── page.py # 8 KB 页面:PageHeader + ItemPointer + Tuple │ │ ├── buffer_pool.py # LRU 缓冲池(类似 PG shared_buffers) │ │ └── types.py # 类型系统 + 元组序列化/反序列化 │ ├── index/ │ │ └── btree.py # B+ 树索引实现 │ ├── catalog/ │ │ └── catalog.py # 系统目录:数据库/表/索引元数据管理 │ ├── transaction/ │ │ └── wal.py # WAL 预写日志 + MVCC 事务管理器 │ ├── parser/ │ │ ├── lexer.py # SQL 词法分析器(Lexer) │ │ ├── ast_nodes.py # AST 节点定义 │ │ └── parser.py # 递归下降 SQL 解析器 │ └── executor/ │ └── executor.py # 查询执行器(HeapScan + 投影 + 聚合 + JOIN) ├── tests/ │ └── test_demo.py # 功能演示测试(37 项测试) └── data/ # 数据目录(运行时自动创建) ``` --- ## 🚀 快速开始 ### 环境要求 - Python **3.8+** - 无需任何第三方依赖,标准库即可运行 ### 安装 ```bash git clone https://gitee.com/srgnet/littledata.git cd littledata ``` ### 启动交互式 CLI ```bash # 启动(数据保存到 ./data 目录) python littledata.py # 指定自定义数据目录 python littledata.py --data-dir /path/to/mydb # 执行单条 SQL 后退出 python littledata.py -c "SELECT * FROM users" # 查看版本 python littledata.py --version ``` --- ## 💻 SQL 用法示例 ### DDL — 建库建表 ```sql -- 创建数据库(切换后在当前 DB 操作) CREATE DATABASE myapp; -- 建表,支持 PRIMARY KEY、NOT NULL、DEFAULT CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT, age INTEGER, score FLOAT DEFAULT 0.0, active BOOLEAN DEFAULT TRUE ); -- 创建普通索引 CREATE INDEX idx_age ON users (age); -- 创建唯一索引 CREATE UNIQUE INDEX idx_email ON users (email); -- 删除表(IF EXISTS 防止报错) DROP TABLE IF EXISTS users; -- 查看元信息 SHOW TABLES; SHOW DATABASES; SHOW INDEXES; ``` ### DML — 增删改查 ```sql -- 插入(按列名) INSERT INTO users (id, name, email, age, score, active) VALUES (1, 'Alice', 'alice@example.com', 30, 9.5, TRUE); -- 插入(位置顺序) INSERT INTO users VALUES (2, 'Bob', NULL, 25, 8.0, TRUE); INSERT INTO users VALUES (3, 'Carol', 'carol@x.com', 17, 7.5, FALSE); -- 全表查询 SELECT * FROM users; -- 条件查询 SELECT name, age FROM users WHERE age > 20; SELECT * FROM users WHERE name LIKE 'A%'; SELECT * FROM users WHERE email IS NULL; SELECT * FROM users WHERE id IN (1, 2, 3); SELECT * FROM users WHERE age BETWEEN 20 AND 30; -- 排序 + 分页 SELECT name, score FROM users ORDER BY score DESC LIMIT 10 OFFSET 0; -- 更新 UPDATE users SET score = 9.9 WHERE name = 'Alice'; UPDATE users SET active = FALSE WHERE age < 18; -- 删除 DELETE FROM users WHERE age < 18; ``` ### 聚合与分组 ```sql -- 聚合函数 SELECT COUNT(*), AVG(score), MAX(age), MIN(age), SUM(score) FROM users; -- GROUP BY SELECT active, COUNT(*) AS cnt FROM users GROUP BY active; -- HAVING 过滤分组 CREATE TABLE orders ( id INTEGER PRIMARY KEY, user_id INTEGER, amount FLOAT, status TEXT ); INSERT INTO orders VALUES (1, 1, 100.0, 'paid'); INSERT INTO orders VALUES (2, 1, 200.0, 'paid'); INSERT INTO orders VALUES (3, 2, 50.0, 'pending'); SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id HAVING SUM(amount) > 100; ``` ### 事务 ```sql -- 开始事务 BEGIN; -- 插入临时数据 INSERT INTO users VALUES (100, 'Temp', NULL, 0, 0.0, TRUE); -- 回滚(数据不会保留) ROLLBACK; -- 正式事务提交 BEGIN; UPDATE users SET score = 10.0 WHERE id = 1; COMMIT; ``` ### 执行计划与维护 ```sql -- 查看查询执行计划 EXPLAIN SELECT * FROM users WHERE age > 20; -- 回收已删除行的空间 VACUUM users; ``` --- ## 🐍 Python API 用法 ```python from src.database import LittleData # 使用 with 语句,自动 close(刷盘 + checkpoint) with LittleData("./mydata") as db: # ── DDL ──────────────────────────────── db.execute(""" CREATE TABLE products ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, price FLOAT, stock INTEGER DEFAULT 0 ) """) db.execute("CREATE INDEX idx_price ON products (price)") # ── 插入 ─────────────────────────────── db.execute("INSERT INTO products VALUES (1, 'Laptop', 999.99, 50)") db.execute("INSERT INTO products VALUES (2, 'Mouse', 29.99, 200)") db.execute("INSERT INTO products VALUES (3, 'Keyboard', 79.99, 100)") # ── 查询 ─────────────────────────────── result = db.execute("SELECT * FROM products WHERE price < 100") print("columns:", result["columns"]) # ['id', 'name', 'price', 'stock'] for row in result["rows"]: print(row) # [2, 'Mouse', 29.99, 200] # ── 聚合 ─────────────────────────────── r = db.execute("SELECT COUNT(*), AVG(price) FROM products") print(r["rows"]) # [[3, 369.99]] # ── 事务 API ─────────────────────────── txn = db.begin() db.execute("UPDATE products SET stock = stock - 1 WHERE id = 1", txn) db.commit(txn) # 也可 db.rollback(txn) # ── 统计信息 ─────────────────────────── import json print(json.dumps(db.stats(), indent=2)) # ── 批量执行多条 SQL ──────────────────── results = db.execute_many(""" INSERT INTO products VALUES (4, 'Monitor', 299.99, 30); INSERT INTO products VALUES (5, 'Webcam', 49.99, 80); SELECT COUNT(*) FROM products; """) for r in results: print(r["message"], r["rows"]) ``` ### 返回值结构 `db.execute()` 返回一个字典: | 键 | 类型 | 说明 | |----|------|------| | `columns` | `List[str]` | 列名列表 | | `rows` | `List[list]` | 数据行(SELECT 时有值) | | `rowcount` | `int` | 影响/返回的行数 | | `message` | `str` | 状态消息,如 `INSERT 0 1`、`ERROR: ...` | --- ## 🖥️ CLI 元命令速查 | 命令 | 说明 | |------|------| | `\d` | 列出当前库所有表 | | `\d