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.2 | 2023年6月18日 |
0.2.0 | 2020年11月15日 |
#33 in 数据库接口
16,848 每月下载量
在34 个crate中使用 (24个直接使用)
82KB
1.5K SLoC
Rusqlite Migration是一个简单且高效的rusqlite架构迁移库。
- 性能:
- 快速数据库打开:为了跟踪当前的迁移状态,大多数工具会在数据库中创建一个或多个表。这些表需要SQLite解析并通过SQL语句进行查询。此库使用
user_version
值代替。它更轻量,因为它只是SQLite文件中的一个固定偏移量中的整数。 - 快速编译:此crate非常小,并且不使用宏来定义迁移。
- 快速数据库打开:为了跟踪当前的迁移状态,大多数工具会在数据库中创建一个或多个表。这些表需要SQLite解析并通过SQL语句进行查询。此库使用
- 简洁性:此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稳定性保证。
活跃用户
这个crate在许多项目中积极使用。你可以在以下位置找到最新的列表
许多贡献者也会在出现问题时报告问题,这是积极使用的另一个指标。
贡献
欢迎贡献(特别是文档或代码改进),请参阅贡献!
我们使用各种工具进行测试,你可能需要本地安装这些工具(例如,以修复失败的CI检查)
致谢
我要感谢所有贡献者,以及这个crate使用的依赖项的作者。
感谢Migadu提供折扣服务以支持此项目。但这并不是Migadu的推荐。
依赖项
~22MB
~421K SLoC