#postgresql #sqlx #orm #activerecord

sqlx-models-orm

基于SQLx的Postgres ActiveRecord

6个版本

0.7.4 2024年6月10日
0.1.6 2022年7月17日
0.1.3 2022年5月28日

#498数据库接口

每月 37次下载

MIT/Apache

15KB
228

Sqlx Models ORM

基于SQLx的Rust ActiveRecord模式。编写惯用的数据库代码(仅限Postgres)。


[dependencies]
sqlx-models-orm = "0.1"

安装

阅读深入教程,该教程同时作为“厨房水槽”测试,见示例

以下是一些节省时间、减少样板代码的功能

模型

  model!{
    state: App,
    table: humans,
    struct Human {
      #[sqlx_model_hints(int4, default)]
      id: i32,
      #[sqlx_model_hints(varchar)]
      name: String,
      #[sqlx_model_hints(int4)]
      age: Option<i32>,
      #[sqlx_model_hints(boolean, default)]
      is_allowed_unlimited_cats: bool,
      #[sqlx_model_hints(boolean)]
      likes_dogs_too: bool,
    },
    has_many {
      Cat(human_id),
    }
  }

创建

  let alice = app.human()
    .insert(InsertHuman{
      name: "Alice".to_string(),
      age: Some(19),
      likes_dogs_too: true,
    })
    .save().await?;

  assert_eq!(alice.attrs, HumanAttrs{
    id: 1,
    name: "Alice".to_string(),
    age: Some(19),
    is_allowed_unlimited_cats: false,
    likes_dogs_too: true,
  });

查询

  let some_humans = app.human()
    .select()
    .limit(2)
    .offset(1)
    .likes_dogs_too_eq(false)
    .order_by(HumanOrderBy::Name)
    .desc(true)
    .all().await?;

  assert_eq!(some_humans, vec![alice]);

更新

  let updated_alice = alice.update().use_struct(UpdateHuman{
    name: Some("Alice Alison".to_string()),
    age: Some(None),
    is_allowed_unlimited_cats: Some(true),
    ..Default::default()
  }).save().await?;

  assert_eq!(updated_alice.attrs, HumanAttrs{
    id: 1,
    name: "Alice Alison".to_string(),
    age: None,
    is_allowed_unlimited_cats: true,
    likes_dogs_too: true,
  });

删除

  alice.delete().await?;

设计原则

  • 状态:您不应该明确传递连接池。
  • 您的结构体,您的抽象:此crate具有一个proc宏,用于为单个数据库表的不同操作创建多个结构体。您可以为这些结构体中的任何一个添加任何方法。不同表中的相同操作的结构体实现了一个公共trait,以允许在这些表的操作中实现一定程度的泛化。
  • 惯用而非高效:这应该很容易学习和使用,即使有性能折衷。
  • 回退到SQLx:始终使回退自定义查询和性能增强成为可能。
  • 每个查询一个表。在ORM中为连接表重新发明SQL难以调试和理解。优先考虑多个单表查询而不是单个多表查询。(见上一项)。
  • 仅编译时检查查询。没有SQL注入的机会,无需进行愚蠢的测试,代价是查询更长。
  • 目前仅限Postgres。对此表示歉意 :(

依赖

~58MB
~1M SLoC