refinery
is powerful SQL migration toolkit for Rust, which makes creating
migrations easy. This crate integrates refinery
with the broader Springtime
Framework allowing for providing database
clients and migrations via dependency injection, which further eases creating
and applying migrations, either from files or Rust code.
Note: in addition to this crate, you need to also import springtime-di.
refinery
db clients supportedAs with refinery
, the basic usage consists of creating or embedding migrations
and providing a runner for desired database.
The following example assumes familiarity with springtime and springtime-di.
```rust use refinerycore::Runner; use springtime::application; use springtime::future::{BoxFuture, FutureExt}; use springtimedi::instanceprovider::ErrorPtr; use springtimemigraterefinery::migration::embedmigrations; use springtimemigraterefinery::runner::MigrationRunnerExecutor;
// this is all that's needed to embed sql migrations from the given folder (the default path is // "migrations") embed_migrations!("examples/migrations");
// this is a migration source, which can provide migrations from code, instead of sql files
struct ExampleMigrationSource;
// register the source with dependency injection
impl MigrationSource for ExampleMigrationSource {
fn migrations(&self) -> Result
// refinery migration runner needs a concrete DB client to run - this necessitates an abstraction // layer; please see MigrationRunnerExecutor for details struct ExampleMigrationRunnerExecutor;
impl MigrationRunnerExecutor for ExampleMigrationRunnerExecutor { fn runmigrations(&self, _runner: &Runner) -> BoxFuture<', Result<(), ErrorPtr>> { // run migrations here with the given runner async { Ok(()) }.boxed() } }
// note: for the sake of simplicity, errors are unwrapped, rather than gracefully handled
async fn main() { // create our application, which will run refinery migration runner before other runners let mut application = application::create_default().expect("unable to create default application");
// will run migrations from the "migrations" folder if MigrationRunnerExecutor(s) are available
application.run().await.expect("error running application");
} ```