19 releases (breaking)

0.17.0 Aug 25, 2024
0.15.0 Aug 25, 2024
0.10.0 Sep 9, 2021
0.8.0 Jan 15, 2021
0.1.2 Sep 19, 2015

#1052 in Database interfaces

MIT/Apache

13KB
169 lines

Rusqlite for Schemamama

A Rusqlite SQLite3 adapter for the lightweight database migration system Schemamama. Depends on the rusqlite crate.

It is based on schemamama_postgres.

Installation

Rusqlite requires sqlite3 dev library to be installed.

Then add Schemamama to your Cargo.toml:

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

You may need to pass in a custom value for the PKG_CONFIG_PATH if rust is unable to locate your sqlite3 installation.

Compatability

This package Rusqlite libqlite3-sys
0.10 0.25 0.22
0.11 0.26 0.23
0.12 0.27 0.24
0.13 0.28 0.25
0.14 0.29 0.26
0.15 0.30 0.27
0.16 0.31 0.28
0.17 0.32 0.30

Usage

First, define some migrations:

#[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 {
    // ...
}

Then, run the migrations!

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);

Testing

Run cargo test

To-do

  • Make metadata table name configurable (currently locked in to schemamama).

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~23MB
~435K SLoC