#sqlite #database-migrations #rusqlite #database-schema #migration #schemamama

schemamama_rusqlite

Rusqlite为Schemamama迁移系统提供的SQLite3适配器

12个版本 (重大更新)

0.10.0 2021年9月9日
0.8.0 2021年1月15日
0.7.0 2019年10月30日
0.5.0 2016年8月9日
0.1.2 2015年9月19日

#2067 in 数据库接口

Download history 15/week @ 2024-03-29 2/week @ 2024-04-05

每月下载 53次

MIT/Apache

13KB
169

Schemamama的Rusqlite

为Schemamama轻量级数据库迁移系统Schemamama提供的Rusqlite SQLite3适配器。依赖于rusqlite crate。

它基于schemamama_postgres。

安装

Rusqlite需要安装sqlite3开发库。

然后,将Schemamama添加到您的Cargo.toml

[dependencies]
schemamama = "*"
schemamama_rusqlite = "*"
rusqlite = "0.2.0"

如果rust无法找到您的sqlite3安装,可能需要传递自定义的PKG_CONFIG_PATH值。

用法

首先,定义一些迁移

#[macro_use]
extern crate schemamama;
extern crate schemamama_rusqlite;
extern crate rusqlite;

use schemamama::{Migration, Migrator};
use schemamama_rusqlite::{SqliteAdapter, SqliteMigration};

struct CreateUsers;
// Instead of using sequential numbers (1, 2, 3...), you may instead choose to use a global
// versioning scheme, such as epoch timestamps.
migration!(CreateUsers, 1, "create users table");

impl SqliteMigration for CreateUsers {
    fn up(&self, conn: &rusqlite::Connection) -> SqliteResult<()> {
        conn.execute("CREATE TABLE users (id BIGINT PRIMARY KEY);", []).map(|_| ())
    }

    fn down(&self, transaction: &rusqlite::Connection) -> SqliteResult<()> {
        transaction.execute("DROP TABLE users;", []).map(|_| ())
    }
}

struct CreateProducts;
migration!(CreateProducts, 2, "create products table");

impl SqliteMigration for CreateProducts {
    // ...
}

然后,运行迁移!

let conn = Rc::new(RefCell::new(SqliteConnection::open_in_memory().expect("open db")));
let adapter = SqliteAdapter::new(conn);

// Create the metadata tables necessary for tracking migrations. This is safe to call more than
// once (`CREATE TABLE IF NOT EXISTS schemamama` is used internally):
adapter.setup_schema();

let mut migrator = Migrator::new(adapter);

migrator.register(Box::new(CreateUsers));
migrator.register(Box::new(CreateProducts));

// Execute migrations up to and including version 2:
migrator.up(Some(2));
assert_eq!(migrator.current_version().expect("current version"), Some(2));

// Reverse all migrations:
migrator.down(None);
assert_eq!(migrator.current_version().expect("current version"), None);

测试

运行 cargo test

待办事项

  • 使元数据表名可配置(目前锁定为schemamama)。

许可证

以下两种许可证之一

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献将根据上述条款双重许可,不附加任何额外条款或条件。

依赖项

~23MB
~439K SLoC