#database-schema #sqlite #database-migrations #rusqlite #schema-version #database-table

rusqlite_migration

使用user_version而不是SQL表来维护当前架构版本的rusqlite简单架构迁移库

19个版本 (5个稳定版本)

1.3.0-alpha-without-tokio…2024年8月11日
1.2.0 2024年3月24日
1.1.0 2023年12月17日
1.1.0-alpha.22023年6月18日
0.2.0 2020年11月15日

#33 in 数据库接口

Download history 4456/week @ 2024-05-04 4983/week @ 2024-05-11 4108/week @ 2024-05-18 3825/week @ 2024-05-25 3496/week @ 2024-06-01 4106/week @ 2024-06-08 3503/week @ 2024-06-15 4426/week @ 2024-06-22 4334/week @ 2024-06-29 5000/week @ 2024-07-06 4268/week @ 2024-07-13 4264/week @ 2024-07-20 4752/week @ 2024-07-27 3899/week @ 2024-08-03 4451/week @ 2024-08-10 3114/week @ 2024-08-17

16,848 每月下载量
34 个crate中使用 (24个直接使用)

Apache-2.0

82KB
1.5K SLoC

Rusqlite Migration

docs.rs Crates.io unsafe forbidden dependency status Coveralls

Rusqlite Migration是一个简单且高效的rusqlite架构迁移库。

  • 性能:
    • 快速数据库打开:为了跟踪当前的迁移状态,大多数工具会在数据库中创建一个或多个表。这些表需要SQLite解析并通过SQL语句进行查询。此库使用user_version值代替。它更轻量,因为它只是SQLite文件中的一个固定偏移量中的整数。
    • 快速编译:此crate非常小,并且不使用宏来定义迁移。
  • 简洁性:此crate追求简洁。只需在Rust代码中将一组SQL语句定义为字符串。根据需要随着时间的推移添加更多SQL语句。无需外部CLI。此外,rusqlite_migration与rusqlite的其他小型库配合使用特别出色,例如serde_rusqlite

示例

在此,我们定义了运行Migrations::new()的SQL语句,并根据需要运行这些语句。

use rusqlite::{params, Connection};
use rusqlite_migration::{Migrations, M};

// 1️⃣ Define migrations
let migrations = Migrations::new(vec![
    M::up("CREATE TABLE friend(name TEXT NOT NULL);"),
    // In the future, add more migrations here:
    //M::up("ALTER TABLE friend ADD COLUMN email TEXT;"),
]);

let mut conn = Connection::open_in_memory().unwrap();

// Apply some PRAGMA, often better to do it outside of migrations
conn.pragma_update_and_check(None, "journal_mode", &"WAL", |_| Ok(())).unwrap();

// 2️⃣ Update the database schema, atomically
migrations.to_latest(&mut conn).unwrap();

// 3️⃣ Use the database 🥳
conn.execute("INSERT INTO friend (name) VALUES (?1)", params!["John"])
    .unwrap();

有关更多信息,请参阅示例文件夹,特别是

  • async迁移在quick_start_async.rs文件中
  • 包含多个SQL语句的迁移(例如使用r#"…"include_str!()
  • 从目录中定义的迁移(SQL文件)
  • 使用lazy_static
  • 向旧版本迁移(向下迁移)

我还制作了一个SQLite pragma速查表,以提高性能和一致性

内置测试

为了测试迁移是否工作,你可以在你的测试模块中添加以下内容

#[test]
fn migrations_test() {
    assert!(MIGRATIONS.validate().is_ok());
}

迁移对象也适合与insta一起进行序列化,使用Debug序列化。你可以这样存储迁移的快照

#[test]
fn migrations_insta_snapshot() {
    let migrations = Migrations::new(vec![
        // ...
    ]);
    insta::assert_debug_snapshot!(migrations);
}

可选功能

Rusqlite_migration提供了几个Cargo功能。它们是

  • from-directory:启用从指定目录中的*.sql文件加载迁移
  • alpha-async-tokio-rusqlite:启用对tokio-rusqlite的异步迁移支持。如名称所示,此功能没有API稳定性保证。

活跃用户

Crates.io Downloads Crates.io Downloads (recent)

这个crate在许多项目中积极使用。你可以在以下位置找到最新的列表

许多贡献者也会在出现问题时报告问题,这是积极使用的另一个指标。

贡献

欢迎贡献(特别是文档或代码改进),请参阅贡献

我们使用各种工具进行测试,你可能需要本地安装这些工具(例如,以修复失败的CI检查)

致谢

我要感谢所有贡献者,以及这个crate使用的依赖项的作者。

感谢Migadu提供折扣服务以支持此项目。但这并不是Migadu的推荐。

依赖项

~22MB
~421K SLoC