| Crates.io | moosicbox_schema |
| lib.rs | moosicbox_schema |
| version | 0.1.4 |
| created_at | 2024-10-04 18:45:36.967831+00 |
| updated_at | 2025-07-21 20:01:33.42233+00 |
| description | MoosicBox schema package |
| homepage | |
| repository | https://github.com/MoosicBox/MoosicBox |
| max_upload_size | |
| id | 1396962 |
| size | 158,510 |
Database migration system for the MoosicBox ecosystem, providing automated SQL migration management for PostgreSQL and SQLite databases with version tracking and rollback support.
Add this to your Cargo.toml:
[dependencies]
moosicbox_schema = "0.1.1"
# Enable database-specific features
moosicbox_schema = { version = "0.1.1", features = ["sqlite", "postgres"] }
use moosicbox_schema::{migrate_library, MigrateError};
use switchy_database::Database;
#[tokio::main]
async fn main() -> Result<(), MigrateError> {
// Initialize your database connection
let db: Box<dyn Database> = /* your database initialization */;
// Run all library migrations
migrate_library(&*db).await?;
println!("Library migrations completed successfully");
Ok(())
}
use moosicbox_schema::migrate_config;
// Run configuration-related migrations
migrate_config(&*db).await?;
use moosicbox_schema::migrate_library_until;
// Run migrations up to a specific version
migrate_library_until(&*db, Some("20231201_add_indexes")).await?;
Migrations are organized in a specific directory structure:
migrations/
├── sqlite/
│ ├── library/
│ │ ├── 20231201_initial_schema/
│ │ │ └── up.sql
│ │ └── 20231202_add_indexes/
│ │ └── up.sql
│ └── config/
│ └── 20231201_config_tables/
│ └── up.sql
└── postgres/
├── library/
│ └── 20231201_initial_schema/
│ └── up.sql
└── config/
└── 20231201_config_tables/
└── up.sql
use moosicbox_schema::Migrations;
use include_dir::{include_dir, Dir};
// Include your migration directory at compile time
static MY_MIGRATIONS: Dir = include_dir!("$CARGO_MANIFEST_DIR/migrations");
// Create a migrations instance
let migrations = Migrations {
directory: MY_MIGRATIONS,
};
// Run all migrations
migrations.run(&*db).await?;
// Or run up to a specific migration
migrations.run_until(&*db, Some("20231201_initial")).await?;
use moosicbox_schema::MigrateError;
match migrate_library(&*db).await {
Ok(()) => println!("Migrations completed successfully"),
Err(MigrateError::Database(db_err)) => {
eprintln!("Database error during migration: {}", db_err);
}
}
The system automatically creates a __moosicbox_schema_migrations table to track which migrations have been applied:
CREATE TABLE __moosicbox_schema_migrations (
name TEXT NOT NULL PRIMARY KEY,
executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
sqlite feature flagpostgres feature flagEach database type has its own set of migration files optimized for that specific database system.
switchy_database: Database abstraction layerinclude_dir: Compile-time directory inclusion for migration filesthiserror: Error handling utilitiesMigrateError: Wraps database errors that occur during migration executionThe migration system ensures your database schema stays up-to-date and consistent across different environments.