#database-migrations #java #database-driver #change #migration #control #version

flyway

Flyway-rs项目,数据库变更控制,类似于Java中的flyway

6个版本

0.3.1 2023年12月24日
0.3.0 2023年12月2日
0.2.2 2023年4月13日
0.1.1 2023年4月4日
0.1.0 2023年3月29日

#1701数据库接口


flyway-rbatis 使用

MIT 许可证

49KB
864

flyway-rs来自db-up

flyway 是一组用于加载和执行数据库迁移的Rust crates。

它旨在作为 refinery 的替代品,因为 refinery 在数据库驱动程序方面相当封闭。基本上,不可能在不创建分支或将驱动程序包含在 refinery crate 中的情况下为 refinery 创建数据库驱动程序 crates。原因是 refinery::Migration::applied(...) 方法不是公开的,这阻止了其他crates实现 refinery::AsyncMigrate trait 并阅读 此问题 看起来作者们没有动力改变这种行为。

flyway 由多个crates组成

  • 顶级crates
    • flyway:主要crate。包含迁移运行器和从其他flyway crates重新导出的必要宏和结构。
    • flyway-rbatis:通过 Rbatis 数据库库执行数据库迁移的驱动程序。
  • 其他crates
    • flyway-codegen:包含 migrations 属性宏
    • flyway-sql-changelog:包含可以加载SQL文件并将它们分割成单独、注解的语句的 ChangelogFile 结构。

状态

此crate有一些已知的(以及可能的一些未知)限制和不稳定问题

  • 事务管理尚未完成。目前,仅实现了“每个变更日志一个事务”的模式,但没有“所有更改一个事务”的模式。我不确定是否有人需要后者,但我计划在某个时候实现它。
  • 在许多地方,“最后一个成功版本”设置不正确,特别是在产生错误时。
  • iter() 实现的 ChangelogFile 还未符合 Rust 标准。
  • 目前,只有 Rbatis 驱动实现可用。
  • flyway-rbatis 中的 Rbatis 驱动使用一套查询来支持 Rbatis 所有的数据库驱动。据我所知,例如从 refinery,某些数据库系统(特别是 MSSQL)支持或甚至需要不同语法来管理状态。
  • 应添加更多示例。
  • 应添加更多测试。

用法

本项目中的所有 crate 都是库。可以启动包含的测试

~$ cd flyway
~/flyway$ cargo test

要在您的项目中使用这些 crate,应采取以下步骤

  1. 在您的 Cargo.toml 中包含必要的 crate(从 crates.io 获取可用版本)
# Add the flyway dependency
[dependency.flyway]
version = "<version>"

# Add the flyway-rbatis dependency in order to run migrations via Rbatis. At the time
# of writing, this is the only supported database driver.
[dependency.flyway-rbatis]
version = "<version>"

# Add Rbatis dependencies ...
  1. 例如,在您的 main.rs
use flyway::{MigrationExecutor, MigrationState, MigrationStateManager, MigrationStore, migrations, MigrationRunner};
use flyway_rbatis::RbatisMigrationDriver;
use rbatis::Rbatis;

// Load migrations (SQL files) from `examples/migrations` and make them available via
// `Migrations::changelog()`. The generated class can be used for `MigrationRunner::migrate(...)`.
#[migrations("examples/migrations")]
pub struct Migrations {
}

async fn run(rbatis: Arc<Rbatis>) -> Result<()> {
    let migration_driver = Arc::new(RbatisMigrationDriver::new(rbatis.clone(), None));
    let migration_runner = MigrationRunner::new(
        Migrations {},
        migration_driver.clone(),
        migration_driver.clone()
    );
    migration_runner.migrate().await?;
}

// Add main method that creates an `Rbatis` instance and calls the `run(...)` method.
// ...

许可证

该项目采用 MIT 许可证。

依赖关系

约 2-3MB
约 62K SLoC