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 |
|
#1307 在 数据库接口
每月 462 次下载
94KB
2K SLoC
重大更改
从 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 ORDER
和COMPACT 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