40 个版本
0.16.0 | 2024 年 8 月 11 日 |
---|---|
0.15.0 | 2023 年 11 月 18 日 |
0.14.0 | 2023 年 5 月 27 日 |
0.13.1 | 2022 年 11 月 8 日 |
0.3.0 | 2020 年 11 月 15 日 |
#57 in 数据库接口
1,620 每月下载量
用于 12 个 Crates (10 直接)
2.5MB
65K SLoC
GlueSQL
作为库的多模型数据库引擎
GlueSQL 是一个用于 SQL 数据库的 Rust 库,包括解析器(sqlparser-rs)、执行层和多种存储选项,包括持久性和非持久性,全部在一个包中。它是一个多功能的开发工具,支持 SQL 和它自己的查询构建器(AST 构建器)。GlueSQL 可以处理结构化和非结构化数据,使其适用于各种用例。它是便携的,可以使用各种存储类型,包括日志文件和读写存储。GlueSQL 设计为可扩展的,并支持自定义计划器,使其成为需要数据库或服务 SQL 支持的开发者的强大工具。GlueSQL 也很灵活,可以在 Rust 和 JavaScript 环境中使用,其语言支持正在不断扩大,包括更多编程语言。
有关如何使用 GlueSQL 的更多信息,请参阅 官方文档网站。该文档提供了有关如何安装和使用 GlueSQL 的详细信息,以及如何创建自定义存储系统和执行 SQL 操作的示例和教程。
"我们提供一项服务,即 GlueSQL 团队可以实施和维护您的自定义存储,特别有利于具有自己查询计划器和执行层的 NoSQL 数据库。我们欢迎任何希望支持 SQL 和 GlueSQL 查询接口的服务。有关更多详细信息,请参阅 此处。"
如果您想更多地了解 GlueSQL,我们建议您阅读以下博客文章,以深入了解其功能和优势
支持 SQL 和 AST 构建器
GlueSQL支持SQL及其自身的查询构建器(AST构建器)。与其他ORM不同,GlueSQL的AST构建器允许开发者直接使用GlueSQL的AST构建查询,从而使用GlueSQL的所有功能。这就是为什么我们称之为AST构建器而不是查询构建器。
Rust示例
let storage = MemoryStorage::default();
let mut glue = Glue::new(storage);
let payloads = glue.execute("SELECT * FROM Foo;").await.unwrap();
SQL示例
SELECT id, name FROM Foo WHERE name = 'Lemon' AND price > 100
AST构建器示例
table("Foo")
.select()
// Filter by name using a SQL string
.filter("name = 'Lemon'")
// Filter by price using AST Builder methods
.filter(col("price").gt(100))
.project("id, name")
.execute(&mut glue)
.await;
支持结构化和非结构化数据,具有灵活的架构
GlueSQL支持结构化和非结构化(无架构)数据。虽然SQL数据库通常假设架构已被定义和使用,但GlueSQL并不做此假设。它支持完全无结构化数据,类似于NoSQL文档数据库,以及半结构化类型,如MAP和LIST。这使得GlueSQL适用于各种用例,包括需要处理非结构化数据的用例。此外,还可以将具有架构和无架构的表连接起来并执行查询。
无架构SQL示例
CREATE TABLE Names (id INTEGER, name TEXT);
INSERT INTO Names VALUES (1, 'glue'), (2, 'sql');
CREATE TABLE Logs;
INSERT INTO Logs VALUES
('{ "id": 1, "value": 30 }'),
('{ "id": 2, "rate": 3.0, "list": [1, 2, 3] }'),
('{ "id": 3, "rate": 5.0, "value": 100 }');
SELECT * FROM Names JOIN Logs ON Names.id = Logs.id;
/*
| id | list | name | rate | value |
|----|---------|------|------|-------|
| 1 | | glue | | 30 |
| 2 |[1, 2, 3]| sql | 3 | |
*/
支持的参考存储
GlueSQL提供多种开箱即用的参考存储,包括简单的内存存储、键值数据库、基于日志文件的存储(如JSON & JSONL),以及由Web浏览器支持的Web存储和IndexedDB。这些参考存储易于使用,可以轻松地适应各种存储系统。此外,GlueSQL不断扩展其支持的存储列表,使其成为开发人员的多功能工具。
内存存储
内存存储是一种基础存储选项,旨在用于内存中的非持久数据。它是一种简单但强大的存储选项,可用于生产环境。
共享内存存储
共享内存存储是一种旨在在并发环境中更舒适地使用内存存储的存储选项。它使用读写锁和原子引用计数包装内存存储,允许您轻松地跨多个线程复制存储实例。所有存储实例都将引用相同的数据,使其成为并发环境的便捷选项。
Sled存储
Sled存储是建立在Rust中的Sled键值嵌入式数据库之上的GlueSQL持久数据存储选项。它是目前唯一受GlueSQL支持的实现所有存储特性(从非集群索引到事务)的存储选项。Sled存储是处理和存储Rust环境中的数据的绝佳选择。要使用Sled存储,您可以使用路径创建SledStorage实例。
JSON存储
使用GlueSQL,您可以使用JSONL或JSON文件作为支持SQL和AST构建器的数据库,这对于需要处理JSON数据的开发者来说是一个强大的选项。JSON存储是一种使用两种类型文件的存储系统:架构文件(可选)和数据文件。架构文件使用标准SQL编写,存储表的架构,而数据文件包含实际数据,并支持两种文件格式:*.json
和*.jsonl
。JSON存储支持所有DML功能,但特别擅长SELECT和INSERT。
CSV存储
GlueSQL中的CSV存储允许您像使用SQL数据库一样处理CSV文件。这个特性对于希望利用CSV文件的简单性同时利用SQL能力的人来说是完美的。
Parquet存储
GlueSQL中的Parquet存储允许您将Parquet文件视为SQL数据库,使您可以直接在Parquet数据上执行SQL操作,如SELECT、INSERT和UPDATE。它提供了一种方便的方式来利用Parquet文件的高效和结构化,同时利用SQL的全部功能。
文件存储
文件存储是一种自定义存储实现,它利用文件系统。对于每个表名,使用CREATE TABLE查询以.sql格式保存模式信息。数据通过创建一个与表同名的目录并在子目录中使用RON格式序列化数据来存储。
Git存储
Git存储是GlueSQL中的一种自定义存储选项,它可以无缝集成Git仓库,让您直接在Git中管理数据的版本。此存储选项自动处理添加和提交操作,确保您的数据更改被跟踪。对于远程操作,如拉取和推送,GitStorage提供开发人员可以手动调用的方法,让您完全控制与远程仓库的同步。
Mongo存储
使用Mongo存储,您可以将mongodb用作SQL查询的存储。您可以使用GlueSQL支持的所有功能,例如聚合和连接,这些功能在非结构化数据库上之前难以处理。特别是,您可以使用GlueSQL强大的模式系统在mongodb上,其强度与关系型数据库相当。要运行测试,请参考此处
Web存储
WebStorage(特别是localStorage和sessionStorage)可以用作GlueSQL的数据存储系统。虽然WebStorage是一个使用字符串键的简单键值数据库,但GlueSQL通过添加对SQL查询的支持使其更加强大。这允许您使用SQL与WebStorage交互,对于熟悉SQL的开发人员来说,这是一个方便的选项。WebStorage可以用于JavaScript(Web)环境和Rust WebAssembly环境。
IndexedDB存储
IndexedDB存储是一个强大的存储系统,允许您使用SQL与IndexedDB交互。虽然直接使用IndexedDB可能具有挑战性,但GlueSQL通过内部处理版本管理和以JSON格式存储数据来简化使用。使用GlueSQL,您可以使用SQL与IndexedDB交互,这对于熟悉SQL的开发人员来说是一个方便的选项。您可以在JavaScript(Web)和Rust WebAssembly环境中使用IndexedDB存储。
组合存储
组合存储是GlueSQL的一个强大功能,允许您将多个现有存储捆绑在一起,从而使您能够在两个不同的存储之间执行JOIN操作。该功能在各种环境中得到应用,包括GlueSQL的JavaScript(Web)界面。具体来说,GlueSQL在JavaScript(Web)界面中使用组合存储将内存、localStorage、sessionStorage和IndexedDB捆绑在一起。这允许您使用四种不同的存储创建表,并使用SQL执行操作,例如JOIN,一次完成。组合存储是一个多才多艺的功能,可以在许多不同场景中使用,对于需要处理多个存储系统(包括在不同存储系统之间进行数据迁移的系统)的开发人员来说是一个有价值的工具。
将GlueSQL适配到您的环境:创建自定义存储
GlueSQL设计用于适应各种环境,包括文件系统、键值数据库、复杂的NoSQL数据库和远程API。要为GlueSQL创建自定义存储,您只需要实现GlueSQL提供的Store和StoreMut特质。这些特质允许您支持SELECT查询和修改数据,如INSERT、UPDATE和DELETE。
如果您想支持额外的功能,如模式更改、事务或自定义函数,您可以实现相应的特质。然而,这些特质是可选的,您可以选择只实现与您的存储系统相关的特质。
为了使开发自定义存储更加容易,GlueSQL提供了一个测试套件,允许您将您的存储实现与一组标准SQL查询进行测试。这确保了您的存储系统与GlueSQL兼容,并且可以处理常见的SQL操作。
总的来说,为GlueSQL创建自定义存储是一个简单的过程,它允许您轻松地将SQL和AST构建器适配到您的环境中。
GlueSQL自定义存储:让我们为您处理
尽管任何人都可以轻松地为GlueSQL开发自定义存储,但我们的GlueSQL团队也可以为您实现和维护它。这尤其适用于具有自己的查询计划器和执行层的NoSQL数据库,因为将GlueSQL适应它们需要深入了解GlueSQL的计划器和存储层细节。我们欢迎不仅包括数据库公司,还包括任何希望支持SQL和GlueSQL查询接口的服务。由于GlueSQL正在快速添加和改进功能,如果您将其委托给我们,我们就可以有效地帮助您开发和管理工作自定义存储。如果您感兴趣,请联系我们:[email protected]。
贡献
GlueSQL是一个比您想象的更简单的数据库项目。您只需要了解三个常见的Rust项目命令:cargo fmt
,cargo clippy
,和cargo test
。不要犹豫,根据您的喜好提交拉取请求并更改代码。我们已设置GitHub Actions来验证您的更改,因此您无需担心出错。GlueSQL核心代码的行覆盖率几乎达到99%,这不仅是因为编写了仔细的测试,还因为测试套件易于理解和使用,即使是那些不熟悉Rust的人也可以使用。如果您不确定从哪里开始,我们建议首先探索测试套件。查看现有功能并尝试理解它们是如何工作的。即使您不熟悉Rust,也应该能够无问题地导航测试套件。如果您想看到但尚未实现的功能,您可以自己实现并贡献给GlueSQL,这是一个很好的参与方式。您还可以查看GlueSQL GitHub存储库中的问题,以获得更多贡献想法。
许可
本项目的许可协议为Apache License,版本2.0 - 有关详细信息,请参阅LICENSE文件。
依赖项
~39–55MB
~1M SLoC