28 个版本 (5 个重大更改)

新功能 0.7.6 2024 年 8 月 24 日
0.7.4 2024 年 7 月 18 日
0.4.10 2024 年 3 月 23 日
0.2.8 2023 年 12 月 27 日
0.2.5 2023 年 11 月 24 日

#1307数据库接口

Download history 175/week @ 2024-05-04 32/week @ 2024-05-11 4/week @ 2024-05-18 114/week @ 2024-05-25 136/week @ 2024-06-01 129/week @ 2024-06-08 18/week @ 2024-06-15 1/week @ 2024-06-22 30/week @ 2024-06-29 167/week @ 2024-07-06 296/week @ 2024-07-13 37/week @ 2024-07-20 292/week @ 2024-07-27 15/week @ 2024-08-03 8/week @ 2024-08-10 145/week @ 2024-08-17

每月 462 次下载

MIT 许可

94KB
2K SLoC

Crates.io License Docs.rs Discord

重大更改

0.4.13 版本开始,UDT 字段必须与数据库中相同的顺序。这是由于 scylla 驱动程序的限制,它不支持命名绑定值。早期版本会自动按名称排序字段,但这种情况不再存在,因为 ORM 无法与现有的 UDT 一起工作。

自动迁移工具

charybdis-migrate 工具可以自动将数据库迁移,无需手动编写迁移脚本。它遍历项目文件,并根据模型定义和数据库之间的差异生成迁移。它支持以下操作

安装

  cargo install charybdis-migrate

使用方法

migrate --hosts <host> --keyspace <your_keyspace> --drop-and-replace (optional)

自动迁移

  • charybdis-migrate 允许自动迁移到数据库,无需手动编写迁移脚本。它期望 src/models 文件,并根据模型定义和数据库之间的差异生成迁移。它支持以下操作

    • 创建新表

    • 创建新列

    • 删除列

    • 更改字段类型(使用 --drop-and-replace 标志删除和重新创建列)

    • 创建二级索引

    • 删除二级索引

    • 创建 UDT

    • 创建物化视图

    • 表选项

        #[charybdis_model(
            table_name = commits,
            partition_keys = [object_id],
            clustering_keys = [created_at, id],
            table_options = r#"
                CLUSTERING ORDER BY (created_at DESC) 
                AND gc_grace_seconds = 86400
            "#
        )]
        #[derive(Serialize, Deserialize, Default)]
        pub struct Commit {...}
      

      ⚠️ 如果表已存在,表选项将生成不包含 CLUSTERING ORDERCOMPACT STORAGE 选项的 alter table 查询。

      未添加模型删除功能。如果您删除了模型,则需要手动删除表。

  • 运行迁移

    ⚠️ 如果您正在处理现有数据集,在运行迁移之前,您需要确保您的**模型**定义结构在表名、列名、列类型、分区键、聚类键和二级索引方面与数据库匹配,以避免意外更改结构。如果结构匹配,则不会运行任何迁移。如上所述,如果没有表的模型定义,它将不会删除它。将来,我们将添加modelize命令,该命令将从现有数据源生成src/models文件。

  • 全局二级索引

    如果存在模型

    #[charybdis_model(
        table_name = users,
        partition_keys = [id],
        clustering_keys = [],
        global_secondary_indexes = [username]
    )]
    

    生成的查询将如下所示: CREATE INDEX ON users (username);

  • 本地二级索引

    范围在分区键上的索引

    #[charybdis_model(
        table_name = menus,
        partition_keys = [location],
        clustering_keys = [name, price, dish_type],
        global_secondary_indexes = [],
        local_secondary_indexes = [dish_type]
    )]
    

    生成的查询将如下所示: CREATE INDEX ON menus((location), dish_type);

定义表

 use charybdis::macros::charybdis_model;
 use charybdis::types::{Text, Timestamp, Uuid};
 
 #[charybdis_model(
     table_name = users,
     partition_keys = [id],
     clustering_keys = [],
     global_secondary_indexes = [username],
     local_secondary_indexes = [],
 )]
 pub struct User {
     pub id: Uuid,
     pub username: Text,
     pub email: Text,
     pub created_at: Timestamp,
     pub updated_at: Timestamp,
     pub address: Address,
 }

定义UDT(用户定义类型)

 use charybdis::macros::charybdis_udt_model;
 use charybdis::types::Text;
 
 #[charybdis_udt_model(type_name = address)]
 pub struct Address {
     pub street: Text,
     pub city: Text,
     pub state: Option<Text>,
     pub zip: Text,
     pub country: Text,
 }

定义物化视图

use charybdis::macros::charybdis_view_model;
use charybdis::types::{Text, Timestamp, Uuid};

#[charybdis_view_model(
    table_name=users_by_username,
    base_table=users,
    partition_keys=[username],
    clustering_keys=[id]
)]
pub struct UsersByUsername {
    pub username: Text,
    pub id: Uuid,
    pub email: Text,
    pub created_at: Timestamp,
    pub updated_at: Timestamp,
}

生成的自动迁移查询将如下所示

CREATE MATERIALIZED VIEW IF NOT EXISTS users_by_email
AS SELECT created_at, updated_at, username, email, id
FROM users
WHERE email IS NOT NULL AND id IS NOT NULL
PRIMARY KEY (email, id)

依赖项

~16–30MB
~403K SLoC