一个用 Rust 编写的简单数据库实现,支持基本的 SQL 操作。
- 🚀 SQL 解析: 支持基本的 SQL 语句解析(CREATE TABLE, INSERT, SELECT)
- 💾 存储引擎: 模块化的存储引擎接口
- 🔍 查询执行: 支持带条件的查询操作
- 🧪 全面测试: 包含完整的单元测试和集成测试
rusty-database/
├── executor/ # SQL 执行引擎
│ ├── src/
│ │ ├── handler.rs # SQL 语句处理器
│ │ ├── error.rs # 错误定义
│ │ ├── formatter.rs # 结果格式化
│ │ └── lib.rs # 模块入口
├── parser/ # SQL 解析器
├── storage/ # 存储引擎
│ ├── src/
│ │ ├── storage_engine_interface.rs # 存储引擎接口
│ │ ├── storage.rs # 存储实现
│ │ └── bplus_tree.rs # B+ 树索引
└── src/ # 主程序
├── main.rs # 程序入口
└── lib.rs # 库入口
- Rust 1.70+
- Cargo
- 克隆项目:
git clone https://github.com/[YOUR_GITHUB_USERNAME]/rusty-database.git
cd rusty-database- 构建项目:
cargo build- 运行测试:
cargo test- 运行主程序:
cargo run我们项目支持CREATE, DROP, INSERT, SELECT等基本的SQL语句。
CREATE TABLE users (
id INT,
name VARCHAR(100),
age INT
);INSERT INTO users (id, name, age) VALUES (1, 'Alice', 30);
INSERT INTO users (id, name, age) VALUES (2, 'Bob', 25), (3, 'Charlie', 35);SELECT * FROM users;
SELECT id, name FROM users WHERE age > 25;
SELECT id, name FROM users WHERE name = 'Alice';# 运行所有测试
cargo test
# 运行特定模块的测试
cargo test -p executor
cargo test -p storage
# 详细输出
cargo test -- --nocapturecargo fmtcargo clippy- Parser: 负责将 SQL 字符串解析为 AST
- Executor: 负责执行 SQL AST,协调各个组件
- Storage: 提供数据存储和检索功能
pub trait StorageEngine {
fn create_table(&mut self, table_name: &str, schema: Schema) -> Result<(), String>;
fn insert_row(&mut self, table_name: &str, row: Row) -> Result<(), String>;
fn select_rows(&self, table_name: &str, columns: Vec<String>, condition: Option<Condition>) -> Result<Vec<Row>, String>;
// ... 更多方法
}我们的执行引擎是数据库系统的核心组件,负责解析和执行 SQL 语句。执行引擎采用模块化设计,通过统一的接口与存储引擎交互。
- SQL 语句解析: 使用
sqlparser-rs库将 SQL 字符串解析为抽象语法树(AST) - 语句执行: 支持 CREATE TABLE、INSERT、SELECT、UPDATE、DELETE 等基本 SQL 操作
- 查询处理: 支持带条件的查询、表达式计算和复合条件查询
- 错误处理: 提供完整的错误信息和异常处理机制
- 结果格式化: 将查询结果格式化为表格形式输出
/// 执行 SQL 字符串并返回输出结果
pub fn execute_sql_and_get_output<T: StorageEngine>(
input_sql: &str,
storage_engine: &mut T
) -> Result<String, String>;
/// 执行单个 SQL 语句
pub fn execute_stmt(
statement: Statement,
storage_engine: &mut dyn StorageEngine,
) -> Result<QueryResult, ExecutionError>;| 语句类型 | 处理函数 | 说明 |
|---|---|---|
SELECT |
handle_query_stmt |
查询数据,支持条件过滤和表达式计算 |
INSERT |
handle_insert_stmt |
插入数据,支持单行和多行插入 |
CREATE TABLE |
handle_create_table_stmt |
创建表,支持约束定义 |
DROP TABLE |
handle_drop_table_stmt |
删除表 |
pub enum QueryResult {
Data(Vec<Row>), // SELECT 查询返回的数据行
RowsAffected(u64), // UPDATE/DELETE 影响的行数
Success, // CREATE/DROP 等操作的成功标识
}执行引擎定义了完整的错误类型体系:
pub enum ExecutionError {
StorageError(String), // 存储引擎错误
SyntaxError, // SQL 语法错误
UnsupportedStatement, // 不支持的语句类型
TableNotFound(String), // 表不存在
ColumnNotFound(String), // 列不存在
}- Fork 此项目
- 创建你的特性分支 (
git checkout -b feature/AmazingFeature) - 提交你的修改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开一个 Pull Request
此项目使用 MIT 许可证 - 查看 LICENSE 文件了解详情。
- 感谢 sqlparser-rs 提供的 SQL 解析功能
- 感谢 Rust 社区的优秀生态系统