#cql #cassandra #scylla-db #ci-cd #migration

bin+lib cquill

Cassandra 和 ScyllaDB 的版本化 CQL 迁移

9 个版本

0.0.9 2024年4月15日
0.0.8 2024年4月15日
0.0.2 2023年10月4日
0.0.1 2023年5月15日

#787 in 数据库接口

Download history 7/week @ 2024-07-01

每月 336 次下载

MIT 许可证

320KB
8K SLoC

CI

Cassandra 和 ScyllaDB 的版本化 CQL 迁移

创建一个包含 CQL 文件的目录。使用 Cquill 在本地进行开发。然后使用 Cquill 对数据库部署进行版本控制、打包和发布。

欢迎投资。

迁移命令

cquill migrate 使用 ./cql 目录中的 cql 源执行迁移。

CQL 文件使用 3 位数字版本前缀进行版本控制,指定为 v001V001,并且必须进行顺序版本控制。 v001-create-api-keyspace.cql 是有效的,而 v8.cql 是无效的。

在发生 CQL 语句错误的情况下,Cquill 将停止执行文件中的语句,并报告哪个语句失败。此时修复是一个手动过程,并且 Cassandra 的错误消息中包含了指导。

迁移历史记录存储在名为 cquill.migrated_cql 的表中,每个完成的 CQL 文件都有一个 md5 哈希记录。未来的迁移将验证先前迁移的 CQL 文件与 md5 哈希。这一步骤确保了正确性,并防止了可能导致数据完整性问题的迁移。

使用 cquill help migrate 获取参数。迁移历史记录表的键空间、名称和复制可以通过迁移命令的参数进行配置。

入门

使用 Cargo 本地安装

Cargo 将使用 install 构建最新发布的 Cquill 版本

cargo install cquill

Cargo 发布的版本在 crates.io/crates/cquill 上详细说明。

在 Docker 容器中运行带有本地 CQL 源的迁移

镜像 84tech/cquill 将在其 /cquill/cql 目录中迁移 CQL 源(在 Cquill 的 Dockerfile 中有文档说明)。

这种方法需要指定 CASSANDRA_NODE 环境变量以匹配 Cassandra 的主机名和 Docker 网络

docker run -it --rm -v $(pwd)/cql:/cquill/cql:ro -e CASSANDRA_NODE=cassandra --network my_network 84tech/cquill migrate

创建版本化 CQL 源的 Docker 镜像

在 CI/CD 自动化的容器化环境中,对工件进行版本控制是工作流程自动化的理想选择。将发布的 CQL 源 ./cql 相对于 WORKDIR 复制。

FROM 84tech/cquill
WORKDIR /
COPY cql cql

给定一个 ./cql 目录和一个 cql.Dockerfile 构建清单,使用Docker构建一个版本化的镜像,以便与API协同部署。

docker build -t my-api-cql:0.0.1 -f cql.Dockerfile .

贡献

RustDocker 是 Cquill 的唯一开发依赖。

使用 docker compose up -d --wait 启动一个 ScyllaDB 实例,用于运行 cargo test

拉取请求的 CI 检查详细说明在 verify.yml 工作流程中。此工作流程运行

cargo fmt
cargo clippy -- -D warnings
cargo test
cargo build --release

路线图

这是一份我希望在未来添加的令人愉快的功能列表

  • cquill verify 命令验证 CQL 文件名、CQL 连接以及先前迁移的 CQL 文件的 md5 哈希。
  • cquill doctor 命令纠正迁移历史和 md5 哈希。
  • cquill dev 命令使用文件监视在积极开发期间删除并重新创建 keyspaces 和表。
  • 支持 v001.dev.cql 或类似开发注释的文件名,以用数据填充开发环境。
  • 为 CQL 语句创建一个 AST,以支持更多附加功能。
    • 在迁移期间重写 keyspaces 名称,以创建系统 keyspaces 的并行部署(用于隔离测试很有用)。
    • 在执行对实时数据库的操作之前验证 CQL 语句的语法。
    • 为 CQL 语句解析特定行和列数据以供命令输出。
    • 反转 CQL 语句,例如将创建列的 ALTER TABLE 语句反转以删除列,以便在错误阻止 CQL 文件完成之前撤销之前执行的语句。

依赖关系

~13–24MB
~331K SLoC