Crates.io | rusqlite_migration |
lib.rs | rusqlite_migration |
version | 1.3.1 |
source | src |
created_at | 2020-11-13 20:56:35.271048 |
updated_at | 2024-10-04 22:55:50.324729 |
description | Simple schema migration library for rusqlite using user_version instead of an SQL table to maintain the current schema version. |
homepage | https://cj.rs/rusqlite_migration |
repository | https://github.com/cljoly/rusqlite_migration |
max_upload_size | |
id | 312108 |
size | 114,063 |
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 Migrations::to_latest()
.
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::open_in_memory().unwrap();
// Apply some PRAGMA, often better to do it outside of migrations
conn.pragma_update_and_check(None, "journal_mode", &"WAL", |_| Ok(())).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:
async
migrations in the quick_start_async.rs
filer#"…"
or include_str!(…)
)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:
#[test]
fn migrations_test() {
assert!(MIGRATIONS.validate().is_ok());
}
The migrations object is also suitable for serialisation with insta, using the Debug
serialisation. You can store a snapshot of your migrations like this:
#[test]
fn migrations_insta_snapshot() {
let migrations = Migrations::new(vec![
// ...
]);
insta::assert_debug_snapshot!(migrations);
}
Rusqlite_migration provides several Cargo features. They are:
from-directory
: enable loading migrations from *.sql files in a given directoryalpha-async-tokio-rusqlite
: enable support for async migrations with tokio-rusqlite
. As the name implies, there are no API stability guarantees on this feature.This crate is actively used in a number of projects. You can find up-to-date list of those on:
A number of contributors are also reporting issues as they arise, another indicator of active use.
Contributions (documentation or code improvements in particular) are welcome, see contributing!
We use various tools for testing that you may find helpful to install locally (e.g. to fix failing CI checks):
I would like to thank all the contributors, as well as the authors of the dependencies this crate uses.
Thanks to Migadu for offering a discounted service to support this project. It is not an endorsement by Migadu though.