#sqlx #postgresql #migration

sqlx-simple-migrator

为 sqlx 和 postgres 提供的一个非常简单的迁移框架

5 个版本

0.0.5 2021年3月12日
0.0.4 2021年2月5日
0.0.3 2020年12月31日
0.0.2 2020年12月11日
0.0.1 2020年10月10日

#2866数据库接口

MIT 协议

12KB
202

sqlx-simple-migrator

这个 crate 是一个非常轻量级的迁移框架。它简单地依次运行一系列 SQL 命令。它并不复杂。

让我们看看这个 crate 使用内置迁移来创建表的方式

pub fn migration() -> Migration {
    Migration::new(NAME)
        .with_up(
            r#"
        CREATE TABLE migrations (
            name TEXT NOT NULL PRIMARY KEY,
            executed_at TIMESTAMPTZ NOT NULL DEFAULT now()
        )
        "#,
        )
        .with_down(
            r#"
        DROP TABLE IF EXISTS migrations
        "#,
        )
}

目前,它针对 TIMESTAMPTZ 进行硬编码,这使得这个 crate 只适用于 Postgres。 @ecton 目前只使用这个 crate 与 Postgres 一起,但欢迎任何贡献使其更加通用。

每个 with_up 调用都是按照它添加到迁移结构中的顺序执行的。当回滚迁移时,with_down 指令以相反的顺序执行。这使得您可以在单个结构的基础上像上面示例中那样编写 with_upwith_down,使上和下逻辑紧密相连。

如果您正在处理一个迁移并希望它每次都执行,只需在返回之前将 .debug() 添加到构建模式即可。 debug() 在没有 cfg(debug_assertions) 的构建上未启用,确保如果您使用 --release 进行部署,您永远不会意外部署一个仍然被标记为调试的迁移。

最后,如果您想测试从头开始重建数据库,可以使用 .nuclear_debug() 代替,这将强制每次运行都撤销所有迁移并重新执行它们。

执行迁移的模式如下

pub fn migrations() -> Vec<Migration> {
    vec![
        migration_0001_accounts::migration(),
        // ...
    ]
}

pub async fn run_all() -> Result<(), MigrationError> {
    let pool = connect_to_postgres();

    Migration::run_all(&pool, migrations()).await
}

依赖项

~20–30MB
~546K SLoC