#sql-database #sql #sqlite #mysql

nightly bin+lib fnck_sql

将 SQL 作为 Rust 函数

14 个版本

0.0.3 2024 年 8 月 17 日
0.0.2 2024 年 8 月 11 日
0.0.1-alpha.152024 年 4 月 5 日
0.0.1-alpha.142024 年 3 月 19 日
0.0.1-alpha.92024 年 1 月 28 日

#239 in 数据库接口

Download history 3/week @ 2024-05-22 1/week @ 2024-06-26 54/week @ 2024-07-03 3/week @ 2024-07-31 183/week @ 2024-08-07 168/week @ 2024-08-14

每月 354 次下载

Apache-2.0

2MB
24K SLoC

Built by @KipData


███████╗███╗   ██╗ ██████╗██╗  ██╗    ███████╗ ██████╗ ██╗     
██╔════╝████╗  ██║██╔════╝██║ ██╔╝    ██╔════╝██╔═══██╗██║     
█████╗  ██╔██╗ ██║██║     █████╔╝     ███████╗██║   ██║██║     
██╔══╝  ██║╚██╗██║██║     ██╔═██╗     ╚════██║██║▄▄ ██║██║     
██║     ██║ ╚████║╚██████╗██║  ██╗    ███████║╚██████╔╝███████╗
╚═╝     ╚═╝  ╚═══╝ ╚═════╝╚═╝  ╚═╝    ╚══════╝ ╚══▀▀═╝ ╚══════╝

-----------------------------------
🖕

轻量级数据库管理系统

 

CI

github star github fork

什么是 FnckSQL

FnckSQL 是一个高性能的 SQL 数据库,可以嵌入到 Rust 代码中(默认基于 RocksDB),使您可以像调用函数一样调用 SQL。它支持 SQL 2016 的大多数语法。

快速入门

提示:首先安装 rust 工具链和 llvm。

克隆仓库

git clone https://github.com/KipData/FnckSQL.git

在代码中使用 FnckSQL

let fnck_sql = DataBaseBuilder::path("./data").build()?;
let tuples = fnck_sql.run("select * from t1")?;

PG Wire 服务

运行 cargo run --features="net" 启动服务器 start 然后使用 psql 进入 SQL pg

存储支持

  • RocksDB

Docker

拉取镜像

docker pull kould23333/fncksql:latest

从源码构建

git clone https://github.com/KipData/FnckSQL.git
cd FnckSQL
docker build -t kould23333/fncksql:latest .

运行

我们在镜像中安装了 psql 工具,以便于调试。

您可以使用 psql -h 127.0.0.1 -p 5432 来执行此操作。

docker run -d \
--name=fncksql \
-p 5432:5432 \
--restart=always \
-v fncksql-data:/fnck_sql/fncksql_data \
-v /etc/localtime:/etc/localtime:ro \
kould23333/fncksql:latest

特性

  • ORM 映射:features = ["marcos"]
#[derive(Default, Debug, PartialEq)]
struct MyStruct {
  c1: i32,
  c2: String,
}

implement_from_tuple!(
    MyStruct, (
        c1: i32 => |inner: &mut MyStruct, value| {
            if let DataValue::Int32(Some(val)) = value {
                inner.c1 = val;
            }
        },
        c2: String => |inner: &mut MyStruct, value| {
            if let DataValue::Utf8(Some(val)) = value {
                inner.c2 = val;
            }
        }
    )
);
  • 用户定义函数: features = ["marcos"]
function!(TestFunction::test(LogicalType::Integer, LogicalType::Integer) -> LogicalType::Integer => |v1: ValueRef, v2: ValueRef| {
    let plus_binary_evaluator = EvaluatorFactory::binary_create(LogicalType::Integer, BinaryOperator::Plus)?;
    let value = plus_binary_evaluator.binary_eval(&v1, &v2);

    let plus_unary_evaluator = EvaluatorFactory::unary_create(LogicalType::Integer, UnaryOperator::Minus)?;
    Ok(plus_unary_evaluator.unary_eval(&value))
});

let fnck_sql = DataBaseBuilder::path("./data")
    .register_function(TestFunction::new())
    .build()?;
  • 优化器
    • RBO
    • 基于RBO(物理选择)的CBO
  • 执行
    • 火山模型
  • MVCC事务
    • 乐观
  • 字段选项
    • [非]空
    • 唯一
    • 主键
  • SQL WHERE选项
    • 是[非]空
    • [非]LIKE
    • [非]IN
  • 支持索引类型
    • 主键
    • 唯一
    • 普通
    • 组合
  • 支持多主键类型
    • 小整数
    • 无符号小整数
    • 短整数
    • 无符号短整数
    • 整数
    • 无符号整数
    • 长整数
    • 无符号长整数
    • 字符
    • 可变长度字符
  • DDL
    • 开始(仅服务器端)
    • 提交(仅服务器端)
    • 回滚(仅服务器端)
    • 创建
      • 索引:唯一\普通\组合
    • 删除
      • 索引
    • 警报
      • 添加列
      • 删除列
    • 截断
  • DQL
    • 选择
      • 顺序扫描
      • 索引扫描
    • WHERE
    • 唯一
    • 别名
    • 聚合:count()/sum()/avg()/min()/max()
    • 子查询select/from/where
    • 连接:内部/左/右/全/交叉(自然\使用)
    • GROUP BY
    • HAVING
    • ORDER BY
    • LIMIT
    • 显示表
    • 解释
    • 描述
    • UNION
  • DML
    • 插入
    • 插入覆盖
    • 更新
    • 删除
    • 分析
  • 数据类型
    • 无效
    • SqlNull
    • 布尔值
    • 小整数
    • 无符号小整数
    • 短整数
    • 无符号短整数
    • 整数
    • 无符号整数
    • 长整数
    • 无符号长整数
    • 浮点数
    • 双精度浮点数
    • 字符
    • 可变长度字符
    • 日期
    • 日期时间
    • 时间
    • 元组

路线图

  • SQL 2016

许可

FnckSQL使用Apache 2.0许可在开源贡献和允许您按需使用软件之间取得平衡。

贡献者

感谢

依赖

~35–50MB
~865K SLoC