Diesel官方写的一篇与其它ORM的比较
Diesel是一款面向Rust的ORM(对象关系映射)库,这篇文章主要是对比了Diesel与其他ORM框架(如ActiveRecord模式的ORM)的特点和优势。首先,Diesel强调类型安全,编译时就能捕获到很多错误,而不是在运行时,这与许多ORM通过动态查询生成SQL不同,Diesel的查询直接在编译时验证,确保查询的正确性。
Diesel提供的另一个关键优势是其查询构建器。相比于SQL模板引擎或直接写SQL,Diesel的查询构建器允许开发者以类似SQL的方式编写查询,但仍然在Rust的类型系统中进行编译时检查。这不仅提高了代码的可读性和维护性,还减少了SQL注入的风险。
文章还提到,Diesel通过宏系统生成模型,允许开发者显式地定义数据结构和关系,这与其他ORM自动生成模型的做法不同,提供了更精细的控制。Diesel还支持事务处理和迁移管理,确保数据的一致性和数据库的演进。
在性能方面,Diesel被设计为非常高效,它减少了不必要的抽象层,直接将Rust结构体映射到SQL查询,避免了性能损耗。最后,文章提到Diesel的社区支持和生态系统,强调其活跃的开发者社区和不断扩展的功能集,包括对多种数据库的支持。
总之,Diesel通过其类型安全、查询构建器、精细控制和高效性能,成为Rust开发者在处理数据库操作时的一个强大选择。
https://diesel.rs/compare_diesel.html
Nutype - 在常规的 newtype 模式中添加额外的约束
Nutype 是一个过程宏(proc macro),允许在常规的 newtype 模式中添加额外的约束,例如数据清理(sanitization)和验证(validation)。生成的代码确保在未通过检查的情况下无法实例化一个值。即使在使用 serde 进行反序列化时,这种机制仍然有效。
use nutype::nutype;
// Define newtype Username
#[nutype(
sanitize(trim, lowercase),
validate(not_empty, len_char_max = 20),
derive(Debug, PartialEq, Clone),
)]
pub struct Username(String);
// We can obtain a value of Username with `::try_new()`.
// Note that Username holds a sanitized string
assert_eq!(
Username::try_new(" FooBar ").unwrap().into_inner(),
"foobar"
);
// It's impossible to obtain an invalid Username
// Note that we also got `UsernameError` enum generated implicitly
// based on the validation rules.
assert_eq!(
Username::try_new(" "),
Err(UsernameError::NotEmptyViolated),
);
assert_eq!(
Username::try_new("TheUserNameIsVeryVeryLong"),
Err(UsernameError::LenCharMaxViolated),
);
验证 Rust's CStr 的安全性
这篇博客文章讨论了使用Kani Rust Verifier来正式验证Rust中CStr类型的安全性。作者强调了验证CStr的安全性对于确保Rust低级抽象的安全性至关重要。
文章首先定义了CStr的安全不变量,包括必须以null结尾且内部不含null字节。接着,文章描述了如何验证CStr的安全方法和不安全方法。安全方法如from_bytes_with_nul和to_bytes的验证,旨在确保它们在操作后仍保持CStr的安全性。不安全方法则需要定义函数契约,以验证如from_bytes_with_nul_unchecked和strlen等函数的安全性。
文章介绍了一种新的方法来生成固定大小的数组切片,用于验证CStr的构造和使用。这通过any_slice_of_array函数来实现,允许在最大尺寸限制下考虑所有可能的切片场景,从而在计算可行性与验证的彻底性之间找到平衡。
在验证中,文章重点讨论了对count_bytes和as_ptr方法的验证。count_bytes方法的验证确保了它能正确处理所有有效输入,包括已有null字节的情况或需要插入null字节的情况。as_ptr方法则涉及到从指针创建CStr的安全性验证,确保提供的指针指向有效的、以null结尾的字符串。
文章最后总结了验证过程中遇到的挑战,如生成合适的输入和处理无限循环等问题,以及如何通过设置循环展开边界和使用kani::any_where来应对这些挑战。通过这些实践,文章展示了如何利用Kani来确保CStr的实现符合Rust的安全保证。
https://model-checking.github.io/kani-verifier-blog/2024/12/03/safety-of-cstr.html
--
From 日报小组 Mike
社区学习交流平台订阅:
Rustcc论坛: 支持rss 微信公众号:Rust语言中文社区