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 使用
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,应采取以下步骤
- 在您的
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 ...
- 例如,在您的
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