Diesel 2.1.0 发布,Rust ORM 框架


Diesel 2.1.0 已正式发布,此版本开发周期总共 9 个月,42 名贡献者提交了超过 380 个 commit。

Diesel 是一个安全可扩展的 Rust ORM 框架和查询构建工具。Diesel 可避免运行时错误,提供最好的性能。

2.1.0 引入了多项新特性,并改进了现有功能。它引入了对通过 Diesel CLI 根据schema.rs文件和数据库之间的差异生成迁移的支持信息。

Diesel derived 现在提供了一个#[derive(MultiConnection)]derive 宏,允许轻松地将不同的数据库连接组合成一个单独的枚举,可自己实现Connection。 MySQL 后端通过ON DUPLICATE KEYS语法获得对upsert查询的支持。

此外还提供了新工具来改进为常见错误情况生成的复杂错误消息。详情查看 Changelog。

2.x 系列重写了大部分内部结构。因此这是新的大版本,它还包含许多破坏兼容性的变化,具体处理方案查看迁移指南。

更新亮点

  • 支持MultiConnection

Diesel 现在包含一个 #[derive(MultiConnection)] proc 宏派生,它允许在单个应用程序中轻松支持多个数据库后端。它可以应用于不同连接的枚举:

#[derive(diesel::MultiConnection)]
pub enum AnyConnection {
Postgresql(diesel::PgConnection),
Mysql(diesel::MysqlConnection),
Sqlite(diesel::SqliteConnection),
}

之后 AnyConnection 类型可以用作普通连接:


fn use_multi(conn: &mut AnyConnection) -> QueryResult<()> {
 // Use the connection enum as any other connection type
 // for inserting/updating/loading/…
 diesel::insert_into(users::table)
 .values(users::name.eq("Sean"))
 .execute(conn)?;

 let users = users::table.load::<(i32, String)>(conn)?;
 Ok(())
}
  • 对 MySQL 后端的 Upsert 支持

Diesel 2.1 使用现有的upsert框架添加了对MySQL 后端INSERT INTO … ON DUPLICATE KEYS …查询的支持。现在支持使用 diesel 提供的 DSL 编写此类查询:

diesel::insert_into(users)
.values(&user2)
.on_conflict(diesel::dsl::DuplicatedKeys)
.do_update()
.set(name.eq("I DONT KNOW ANYMORE"))
.execute(conn)?;
  • 改进错误信息

此版本改进了 rustc 为常见的 Diesel 问题生成的错误消息。

比如下面的示例:

table! {
users {
id -> Integer,
name -> Text,
}
}

#[derive(Queryable)]
struct User {
name: String,
id: i32,
}


users::table.load::<User>(&mut conn)

将生成以下错误消息:

error[E0277]: the trait bound `(diesel::sql_types::Integer, diesel::sql_types::Text): load_dsl::private::CompatibleType<User, Mysql>` is not satisfied
--> src/main.rs:20:31
 |
20 | users::table.load::<User>(&mut conn);
 |---- ^^^^^^^^^ the trait `load_dsl::private::CompatibleType<User, Mysql>` is not implemented for `(diesel::sql_types::Integer, diesel::sql_types::Text)`
 ||
 |required by a bound introduced by this call
 |
 = help: the following other types implement trait `load_dsl::private::CompatibleType<U, DB>`:
 (ST0, ST1)
 (ST0, ST1, ST2)
 (ST0, ST1, ST2, ST3)
 (ST0, ST1, ST2, ST3, ST4)
 (ST0, ST1, ST2, ST3, ST4, ST5)
 (ST0, ST1, ST2, ST3, ST4, ST5, ST6)
 (ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7)
 (ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7, ST8)
 and 24 others
 = note: required for `users::table` to implement `LoadQuery<'_, _, User>`
note: required by a bound in `diesel::RunQueryDsl::load`
--> /home/weiznich/.cargo/git/checkouts/diesel-6e3331fb3b9331ec/ef6252e/diesel/src/query_dsl/mod.rs:1543:15
 |
1543 | Self: LoadQuery<'query, Conn, U>,
 | ^^^^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `diesel::RunQueryDsl::load`

在新版本则生成以下错误信息:

error[E0277]: the trait bound `i32: FromSql<diesel::sql_types::Text, Mysql>` is not satisfied
--> src/main.rs:13:11
 |
13 | name: i32,
 | ^^^ the trait `FromSql<diesel::sql_types::Text, Mysql>` is not implemented for `i32`
 |
 = help: the trait `FromSql<diesel::sql_types::Integer, Mysql>` is implemented for `i32`
 = note: required for `i32` to implement `diesel::Queryable<diesel::sql_types::Text, Mysql>`
 = note: required for `i32` to implement `FromSqlRow<diesel::sql_types::Text, Mysql>`
 = help: see issue #48214

Release Notes


相關推薦

2023-04-28

Diesel 是一个安全可扩展的 Rust ORM 框架和查询构建工具,可避免运行时错误,提供最好的性能。 最新发布的 2.0.4 版本包含如下变化: 支持libsqlite3-sys 0.26 修复 rust-analyzer 中缺少名称解析的问题 修复导致为自定

2022-09-03

Diesel 2.0.0 已正式发布。据称此版本开发周期长达 3 年,包含了超过 1700 次 commit。 Diesel 是一个安全可扩展的 Rust ORM 框架和查询构建工具。Diesel 可避免运行时错误,提供最好的性能。 2.0 添加了许多新功能,并重写了大部

2022-08-07

线程基准测试可以轻松达到 200,000 QPS。 目前 Rbatis 4.0.0 发布了,带来如下变更: 删除了 sqlx-core 添加 rbdc 驱动程序(mysql、sqlite、mssql、pg....等等)。重写的数据库驱动类似于 JDBC,实现 Box Dyn 依赖分离 添加 mobc 连接池

2024-03-28

Zino 开发框架已发布 0.18 版本!这两个多月的改进,主要集中在以下方面: 添加了Plugin类型,可用于加载异步初始化的插件,支持运行环境选择以及依赖检测; 进一步改善ORM,添加时区设置,优化数据库连接时create_table的

2024-01-09

Zino 开发框架已发布 0.18 版本!这一个月的改进,主要集中在以下方面: 移除所有nightly特性,使框架运行在稳定版Rust 1.75+; 改进内置ORM对事务以及SQLite数据库的支持; 支持通过URL加载JSON和YAML格式的配置文件; 时间处

2023-09-17

dioxus等框架集成,打通社区生态资源。 Zino开发框架已发布0.12版本!这一个月的改进,主要集中在以下方面: 初步集成dioxus-desktop,可用来开发桌面应用。 进一步完善ORM功能,新增支持SQLite数据库。 完整支持OpenAPI规范

2023-08-10

Zino开发框架已发布 0.11 版本!这一个月的改进,主要集中在以下方面: 内置UserSession,完善身份认证和用户授权功能; 引入WebHooks,便于集成第三方API; 支持通过OpenAPI配置进行模型字段翻译; 实现NamedFile,支持文件上

2023-12-11

Zino开发框架已发布0.16版本!这一个月的改进,主要集中在以下方面: 完善zino-derive功能,ORM涉及的所有trait都可以自动推导; 改进Application trait,支持custom loader和graceful shutdown; 重构定时任务,便于集成第三方库; 实

2023-07-10

Zino开发框架已发布 0.10 版本!这两个月的改进,主要集中在以下方面: 通过条件编译实现ORM支持MySQL和PostgreSQL; 实现DefaultController,为应用模型自动提供增删改查、导入导出接口; 通过ModelHooks注入模型自定义行为,通过

2023-04-02

SQLAlchemy 2.0.8 现已发布。 SQLAlchemy 是一个 Python 的 SQL 工具包以及数据库对象映射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 2.0.8 版包括对 Core 和 ORM 组件的各种错误修复。大多数 ORM

2023-10-14

SQLAlchemy 2.0.22 现已发布。 SQLAlchemy 是一个 Python 的 SQL 工具包以及数据库对象映射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 2.0.22 版包含对 ORM、sql、引擎、MariaDB 和 MSSQL 组件的各种

2023-02-19

SQLAlchemy 2.0.4 现已发布。 2.0.4 版为 2.0 系列提供了一些新功能,包括对 Pydantic 数据类的插件支持、改进的混合属性类型结构,以及在使用 ORM 声明映射时显式控制表列排序顺序的能力。 详情可查看 Changelog。 下载地址:https://ww

2023-07-17

SQLAlchemy 2.0.19 已发布。 此版本包括针对 ORM、引擎和 PostgreSQL 组件内的修复,包括针对所有 PostgreSQL 方言的回归错误修复,以防止"Google Cloud SQL"平台使用的样式的 URL 被错误解析。 详情查看 Changelog。 下载地址:https://www.sqlalche

2023-04-29

SQLAlchemy 2.0.11 现已发布。 SQLAlchemy 是一个 Python 的 SQL 工具包以及数据库对象映射 (ORM) 框架。它包含整套企业级持久化模式,专门用于高效和高性能的数据库访问。 2.0.11 版修复了 2.0.10 中因“insertmanyvalues”重构而引入的