# Rusqlite Migration [![docs.rs](https://img.shields.io/docsrs/rusqlite_migration?style=flat-square)](https://docs.rs/rusqlite_migration) [![Crates.io](https://img.shields.io/crates/v/rusqlite_migration?style=flat-square)](https://crates.io/crates/rusqlite_migration) [![unsafe forbidden](https://img.shields.io/badge/unsafe-forbidden-success.svg?style=flat-square)](https://github.com/rust-secure-code/safety-dance/)

Rusqlite Migration is a simple schema migration tool for rusqlite using user_version instead of an SQL table to maintain the current schema version.

It aims for: - simplicity: define a set of SQL statements. Just add more SQL statement to change the schema. No external CLI, no macro. - performance: no need to add a table to be parsed, the user_version field is at a fixed offset in the sqlite file format.

Example

Here, we define SQL statements to run with Migrations::new and run these (if necessary) with .to_latest().

```rust use lazystatic::lazystatic; use rusqlite::{params, Connection}; use rusqlite_migration::{Migrations, M};

// 1️⃣ Define migrations lazy_static! { static ref MIGRATIONS: Migrations<'static> = Migrations::new(vec![ M::up(r#" CREATE TABLE friend( name TEXT NOT NULL, email TEXT UNIQUE ); "#), // In the future, add more migrations here: //M::up("ALTER TABLE friend ADD COLUMN birthday TEXT;"), ]); }

fn main() { let mut conn = Connection::openinmemory().unwrap(); // Apply some PRAGMA, often better to do it outside of migrations conn.pragmaupdate(None, "journalmode", &"WAL").unwrap();

// 2️⃣ Update the database schema, atomically
MIGRATIONS.to_latest(&mut conn).unwrap();

// Use the database 🥳
conn.execute(
    "INSERT INTO friend (name, email) \
     VALUES (?1, ?2)",
    params!["John", "john@example.org"],
)
.unwrap();

} ```

Built-in tests

To test that the migrations are working, you can add this in your test module:

```rust

[test]

fn migrationstest() { assert!(MIGRATIONS.validate().isok()); } ```

Migrations to previous versions, more detailed examples…

Please see the examples folder for more.

Acknowledgments

I would like to thank all the contributors, as well as the authors of the dependancies this crate uses.