24 个版本

0.8.14 2024年4月3日
0.8.13 2024年3月29日
0.8.12 2024年1月22日
0.8.11 2023年9月13日
0.1.0 2015年11月22日

#32数据库接口

Download history 22046/week @ 2024-04-18 22388/week @ 2024-04-25 21587/week @ 2024-05-02 21108/week @ 2024-05-09 26310/week @ 2024-05-16 27803/week @ 2024-05-23 20919/week @ 2024-05-30 27826/week @ 2024-06-06 22626/week @ 2024-06-13 23201/week @ 2024-06-20 25588/week @ 2024-06-27 21292/week @ 2024-07-04 24470/week @ 2024-07-11 21473/week @ 2024-07-18 20843/week @ 2024-07-25 23457/week @ 2024-08-01

94,662 每月下载量
用于 30 个 Crates (19 个直接使用)

MIT 许可证

115KB
2.5K SLoC

refinery Logo

Rust 强大的 SQL 迁移工具包。

Crates.io docs.rs MIT licensed Build Status


Refinery 致力于让不同数据库的迁移尽可能简单。它通过在提供的数据库连接上运行迁移来实现,无论是通过将其嵌入到 Rust 代码中,还是通过 refinery_cli

目前支持 postgrestokio-postgresmysqlmysql_asyncrusqlitetiberius。如果你使用的是尚未支持的驱动程序,即 SQLx,你可以通过提供一个 Config 来运行迁移,而不是连接类型,因为 Config 实现了 Migrate。你仍然需要为 Runner::runtokio-postgres/mysql_async 提供 postgres/mysql/rusqlite/tiberius 驱动程序作为 Runner::run_async 的功能。与 Barrel 一起使用效果最佳,但你也可以将迁移放在 .sql 文件中或使用任何其他 Rust crate 来生成模式。

用法

  • 将所选驱动器作为功能添加到Cargo.toml的依赖项中,例如:refinery = { version = "0.8", features = ["rusqlite"]}
  • 迁移可以在.sql文件或必须具有名为migration的函数的Rust模块中定义,该函数返回一个String
  • 可以通过在文件名前加上V来严格版本控制迁移,或者通过在文件名前加上U来进行非严格版本控制。
  • 迁移,无论是.sql文件还是Rust模块,都必须按照以下格式命名:[U|V]{1}}__{2}.sql[U|V]{1}__{2}.rs,其中{1}表示迁移版本,而{2}表示名称。
  • 迁移可以通过使用embed_migrations宏将其嵌入到Rust代码中,或者通过refinery_cli运行。

示例:库

use rusqlite::Connection;

mod embedded {
    use refinery::embed_migrations;
    embed_migrations!("./tests/sql_migrations");
}

fn main() {
    let mut conn = Connection::open_in_memory().unwrap();
    embedded::migrations::runner().run(&mut conn).unwrap();
}

有关更多库示例,请参阅examples

示例:命令行界面

注意

  • 连续(相邻)迁移版本号限制为u32(无符号,32位整数)。
  • 非连续(非相邻)迁移版本号限制为u32(无符号,32位整数)。
export DATABASE_URL="postgres://postgres:secret@localhost:5432/your-db"
pushd migrations
    # Runs ./src/V1__*.rs or ./src/V1__*.sql 
    refinery migrate -e DATABASE_URL -p ./src -t 1
popd

示例:死侍

let mut conn = pool.get().await?;
let client = conn.deref_mut().deref_mut();
let report = embedded::migrations::runner().run_async(client).await?;

连续与非连续迁移

根据您的项目/团队的构建方式,将决定您是想使用连续(相邻)迁移V{1}__{2}.[sql|rs]还是非连续(非相邻)迁移U{1}__{2}.[sql|rs]。如果迁移顺序编号反映了它们开发时的顺序,并且按编号顺序部署,则使用连续迁移不会遇到任何问题。这是因为您可以确信要运行的下一个迁移始终将具有比上一个更大的版本号。

在不连续迁移的情况下,创建和部署迁移的顺序更加灵活。如果开发者1今天创建了一个带有迁移的PR U11__update_cars_table.sql,但被评审了一周。与此同时,开发者2创建了一个带有迁移 U12__create_model_tags.sql 的PR,这个迁移更简单,并且立即合并和部署。如果你使用连续迁移,这将阻止开发者1的迁移运行,因为下一个迁移的版本号需要大于12。

实现细节

refinery通过创建一个表来保存所有已应用的迁移版本及其元数据。当你运行迁移 Runner 时,refinery会将已应用的迁移与将要应用的迁移进行比较,检查是否存在分歧缺失的情况,并执行未应用的迁移。
默认情况下,refinery会在单个事务中运行每个迁移。或者,你也可以配置refinery,通过设置set_grouped为true,将所有迁移的执行封装在一个事务中。

回滚

refinery的设计基于flyway,因此它继承了其早期关于撤销/回滚迁移的哲学。尽管flyway已经改变了它的看法,但refinery没有。要撤销/回滚迁移,你必须生成一个新的迁移并明确写出你想要撤销的内容。

MSRV

refinery旨在支持稳定版Rust、之前的Rust版本和夜间版。

异步

从版本0.2开始,refinery支持tokio-postgresmysql_asyncTiberius。对于Rusqlite,在异步环境中运行迁移的最佳方式是在tokio的spawn_blocking中运行它们,例如。

贡献

🎈 感谢你为改进项目做出的贡献!任何贡献都不会太小,所有贡献都备受珍视,请随时提出问题和提交拉取请求。

许可

本项目采用MIT许可

贡献

除非你明确声明,否则你有意提交给refinery的任何贡献都将按照MIT许可,不附加任何额外条款或条件。

依赖

~4–21MB
~308K SLoC