A PostgreSQL adapter for the lightweight database migration system
Schemamama. Depends on the
postgres
crate.
If you're using Cargo, just add Schemamama to your Cargo.toml
:
toml
[dependencies]
schemamama = "0.0.11"
schemamama_postgres = "0.0.8"
postgres = "0.11"
First, define some migrations:
```rust
extern crate schemamama; extern crate schemamama_postgres; extern crate postgres;
use schemamama::{Migration, Migrator}; use schemamama_postgres::{PostgresAdapter, PostgresMigration};
struct CreateUsers; // Instead of using sequential numbers (1, 2, 3...), you may choose to use a collaborative // versioning scheme, such as epoch timestamps. migration!(CreateUsers, 1, "create users table");
impl PostgresMigration for CreateUsers { fn up(&self, transaction: &postgres::Transaction) -> Result<(), PostgresError> { transaction.execute("CREATE TABLE users (id BIGINT PRIMARY KEY);", &[]) }
fn down(&self, transaction: &postgres::Transaction) -> Result<(), PostgresError> {
transaction.execute("DROP TABLE users;", &[])
}
}
struct CreateProducts; migration!(CreateProducts, 2, "create products table");
impl PostgresMigration for CreateProducts { // ... } ```
Then, run the migrations!
``rust
let url = "postgres://postgres@localhost";
let connection = postgres::Connection::connect(url, &SslMode::None).unwrap();
let adapter = PostgresAdapter::new(&connection);
// 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(2); asserteq!(migrator.currentversion(), Some(2));
// Reverse all migrations: migrator.down(None); asserteq!(migrator.currentversion(), None); ```
To run cargo test
, you must have PostgreSQL running locally with a user role
named postgres
with login access to a database named postgres
. All tests
will work in the pg_temp
schema, so the database will not be modified.
schemamama
).