5 个不稳定版本

0.3.1 2023年4月20日
0.2.0 2023年4月13日
0.1.2 2023年3月28日
0.1.1 2023年3月21日
0.1.0 2022年12月25日

#2632数据库接口

25 每月下载量

MIT 许可证

235KB
4.5K SLoC

CANYON-SQL

一个全功能、支持多数据库的 Rust ORM。

  • crates.io
  • Continuous Integration
  • Code Quality
  • Code Coverage Measure
  • Code Coverage Status

Canyon-SQL 是一个用于同时处理多个数据库的高级抽象层。它基于 async 语言特性,提供了一个高速、高性能的库,用于处理消费者的数据访问。

早期阶段声明

该库目前处于 早期阶段。任何通过 fork + PR 的贡献都备受赞赏。目前,我们正在进行非常活跃的项目开发。

完整文档资源

有一个 work-in-progress 网页,使用 mdBook 构建,包含官方文档。这里是您找到所有 Canyon-SQL 技术文档的地方。您可以点击此链接 阅读它

最重要的功能

  • 默认异步。几乎所有的功能都准备好了,可以并发使用。
  • 使用多个数据源。您可以在同一时间查询多个数据库,甚至不同的数据库!这意味着您将能够在同一项目中并发查询 PostgreSQLSqlServer 数据库。
  • 基于宏。通过一些注释和配置文件,您就可以开始编写数据访问代码了。
  • 支持迁移。带有 神模式Canyon-SQL 可为您管理数据库中的每个表。您可以在 Canyon 代码中修改表结构,例如更改列、设置约束等。此外,未来我们还计划允许您以编程方式操作整个服务器,例如创建数据库、更改配置等,所有这些操作都将通过 Canyon 完成!

支持的数据库

Canyon-SQL 目前支持以下数据库

  • PostgreSQL(通过 tokio-postgres 包)
  • SqlServer(通过 tiberius 包)

上述所有包都是基于 async 的包,与 Canyon-SQL 的设计指南一致。

计划包含更多数据库引擎。

以示例展示

让我们来看看 Canyon 代码的样子!

经典的 SELECT * FROM {表名}

let find_all_result: Result<Vec<League>, Box<dyn Error + Send + Sync>> =  League::find_all().await;

// Connection doesn't return an error
assert!(find_all_result.is_ok());
// We retrieved elements from the League table
assert!(!find_all_result.unwrap().is_empty());

在主键列上执行搜索

let find_by_pk_result: Result<Option<League>, Box<dyn Error + Send + Sync>> = League::find_by_pk(&1).await;

assert!(find_by_pk_result.as_ref().unwrap().is_some());

let some_league = find_by_pk_result.unwrap().unwrap();
assert_eq!(some_league.id, 1);
assert_eq!(some_league.ext_id, 100695891328981122_i64);
assert_eq!(some_league.slug, "european-masters");
assert_eq!(some_league.name, "European Masters");
assert_eq!(some_league.region, "EUROPE");
assert_eq!(
    some_league.image_url,
    "http://static.lolesports.com/leagues/EM_Bug_Outline1.png"
);

注意 find_by_pk(...) 参数的引导引用。此关联函数接收一个 &dyn QueryParameter<'_> 作为参数,而不是值。

构建更复杂的查询

为了展示 Canyon 的功能,我们将使用 SelectQueryBuilder<T>,它实现了 QueryBuilder<T> 特性,用于构建更复杂的 WHERE 条件、过滤数据和连接表。

let mut select_with_joins = LeagueTournament::select_query();
    select_with_joins
        .inner_join("tournament", "league.id", "tournament.league_id")
        .left_join("team", "tournament.id", "player.tournament_id")
        .r#where(LeagueFieldValue::id(&7), Comp::Gt)
        .and(LeagueFieldValue::name(&"KOREA"), Comp::Eq)
        .and_values_in(LeagueField::name, &["LCK", "STRANGER THINGS"]);
    // NOTE: We don't have in the docker the generated relationships
    // with the joins, so for now, we are just going to check that the
    // generated SQL by the SelectQueryBuilder<T> is the spected
    assert_eq!(
        select_with_joins.read_sql(),
        "SELECT * FROM league INNER JOIN tournament ON league.id = tournament.league_id LEFT JOIN team ON tournament.id = player.tournament_id WHERE id > $1 AND name = $2  AND name IN ($2, $3) "
    )

注意:目前,当您使用连接时,您需要创建一个新的模型,其中包含两个表中的列(如果您希望在这些列中获取数据),但只需遵循 CanyonMapper 的常规流程。它会尝试获取每个声明的字段的值。如果您没有声明在开放子句中(在这种情况下 (*))的字段,则该字段不会检索。没问题。但是,如果您有无法与数据库中的某些列映射的字段,程序将崩溃。

更多示例

如果您想看更多示例,可以查看此存储库根目录下的 tests 文件夹。每个可用的数据库操作都在那里进行了测试,因此您可以使用它来查找上述文档中描述的操作的用法。

为 CANYON-SQL 贡献

首先,感谢您考虑帮助我们项目。您可以查看我们的 模板指南

但,为了总结

  • 查看已打开的问题,看看是否已经存在,或者是否有人正在解决它。即使如此,您也可以参与其中,阐述您的观点,甚至帮助完成任务。
  • Canyon-SQL 进行分叉
  • 如果您已打开问题,请从存储库的基本分支(即默认分支)创建分支,并将其指向您的分叉。
  • 完成更改后,向默认分支提交 PR。尽可能好地填写提供的模板。
  • 等待批准。在大多数情况下,在批准您的更改之前,将需要对功能进行测试。

关于测试呢?

通常在 Canyon 中,独立的单元测试被编写为文档测试,而集成测试位于文件夹 ./tests 下。

如果您想运行测试(因为在fork仓库后,这是您想做的第一件事),在运行测试之前需要考虑以下几点。

  • 目标机器上需要安装Docker。
  • 如果您已安装Docker,并且已克隆或fork了 Canyon-SQL,您可以运行我们的docker-compose文件 (docker/docker-compose.yml),该文件将初始化一个 PostgreSQL 数据库,并将内容放入其中,以便测试能够运行。
  • 最后,有一些测试针对 MSSQL 进行。我们没有找到一种在Docker启动时直接插入数据的好方法,而是运行了一个位于 tests/crud/mod.rs 的非常特殊的测试,其名称为 initialize_sql_server_docker_instance。当您运行此测试时,初始数据将被插入到测试运行时创建的表中。(如果您知道更好的方法,请创建一个 issue 告诉我们,并改进这个过程!)

依赖项

~8–21MB
~301K SLoC