#迁移 #libsql #sql

migrations

一个用于处理迁移的小型库,内置对libsql的支持。

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数据库接口

Download history 292/week @ 2024-06-22 22/week @ 2024-06-29 8/week @ 2024-07-06 67/week @ 2024-07-27

每月78次下载

MIT 许可证

29KB
676

migrations

安装

cargo add migrations

用法

功能

  • 默认:包含 files 功能
  • files:用于基于文件迁移,最可能是文本或JSON,但这些都是传递给此存储的功能。 ChangesetStores::files
  • sql:用于基于SQL的迁移,具有一个包含上.sql和down.sql文件夹的目录。 ChangesetStores::sql
  • libsql:完整的libsql迁移功能,使用SQL功能。 Migrations::libsqlMigrationStores::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