Rusqlite Migration is a simple and performant schema migration library for rusqlite.
user_version
value instead. It’s much lighter as it is just an integer at a fixed offset in the SQLite file.Here, we define SQL statements to run with Migrations::new and run these (if necessary) with .to_latest().
``` rust use rusqlite::{params, Connection}; use rusqlite_migration::{Migrations, M};
// 1️⃣ Define migrations let migrations = Migrations::new(vec![ M::up("CREATE TABLE friend(name TEXT NOT NULL);"), // In the future, add more migrations here: //M::up("ALTER TABLE friend ADD COLUMN email TEXT;"), ]);
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();
// 3️⃣ Use the database 🥳 conn.execute("INSERT INTO friend (name) VALUES (?1)", params!["John"]) .unwrap(); ```
Please see the examples folder for more, in particular:
- migrations with multiple SQL statements (using for instance r#"…"
or include_str!(…)
)
- use of lazy_static
- migrations to previous versions (downward migrations)
I’ve also made a cheatsheet of SQLite pragma for improved performance and consistency.
To test that the migrations are working, you can add this in your test module:
``` rust
fn migrationstest() { assert!(MIGRATIONS.validate().isok()); } ```
Contributions (documentation or code improvements in particular) are welcome, see contributing!
I would like to thank all the contributors, as well as the authors of the dependencies this crate uses.