4个版本
0.2.2 | 2024年6月26日 |
---|---|
0.2.1 | 2024年6月26日 |
0.2.0 | 2024年6月26日 |
0.1.0 | 2024年6月25日 |
#1103 在 数据库接口
每月78次下载
29KB
676 行
migrations
安装
cargo add migrations
用法
功能
- 默认:包含
files
功能 - files:用于基于文件迁移,最可能是文本或JSON,但这些都是传递给此存储的功能。
ChangesetStores::files
- sql:用于基于SQL的迁移,具有一个包含上.sql和down.sql文件夹的目录。
ChangesetStores::sql
- libsql:完整的libsql迁移功能,使用SQL功能。
Migrations::libsql
,MigrationStores::libsql
- all:包含所有功能
LibSql
use migrations::Migrations;
fn main() {
let db = async_std::task::block_on(Builder::new_local(&db_identifier.as_str()).build()).unwrap();
let connection = db.connect().unwrap();
/**
* The migrations folder should contain a set of folders that match: YYYYMMDDHHMMSS_<\w+>
* Each migration is stored in its own folder, with two files up.sql and down.sql.
**/
let migrations = Migrations::libsql(connection, std::env::current_dir().unwrap().join("migrations"));
migrations.setup().unwrap();
migrations.migrate().unwrap();
// rollback only the last migration
migrations.rollback().unwrap();
// rollback all migrations
migrations.reset().unwrap();
}
概念
迁移基于以下内部概念:
Changesets
包含要运行的Changesets,基于两个特性和ChangesetStore
。
pub trait ChangesetStore {
fn create_changeset(&self, name: String) -> anyhow::Result<Box<dyn Changeset + '_>>;
fn get_changesets(&self) -> anyhow::Result<Vec<Box<dyn Changeset>>>;
fn clone(&self) -> Box<dyn ChangesetStore + '_>;
}
pub trait Changeset {
fn identifier(&self) -> Identifier;
fn apply(&self, store: &dyn MigrationStore) -> anyhow::Result<()>;
fn rollback(&self, store: &dyn MigrationStore) -> anyhow::Result<()>;
fn duplicate(&self) -> Box<dyn Changeset>;
}
FileActions
允许文件被MigrationStore使用,例如运行sql文件的数据库。
pub trait FileActions {
fn run(&self, file: &PathBuf) -> anyhow::Result<()>;
}
MigrationStore
根据MigrationStore
特性和MigrationStore
运行Changesets。
pub trait MigrationStore {
fn is_ready(&self) -> anyhow::Result<bool>;
fn setup(&self) -> anyhow::Result<()>;
fn is_applied(&self, identifier: &Identifier) -> bool;
fn apply(&mut self, changeset: &Box<dyn Changeset>) -> anyhow::Result<()>;
fn rollback(&mut self, changeset: &Box<dyn Changeset>) -> anyhow::Result<()>;
fn clone(&self) -> Box<dyn MigrationStore + '_>;
fn file_actions(&self) -> Option<&dyn FileActions> {
None
}
}
依赖项
~1–12MB
~118K SLoC