parsql-migrations
A simple, type-safe database migration system for Rust that works with PostgreSQL and SQLite.
Features
- Multi-database support: PostgreSQL (sync/async) and SQLite
- Transaction safety: Each migration runs in its own transaction (configurable)
- Checksum verification: Detect modified migrations
- Gap detection: Prevent missing migrations in sequence
- Simple trait-based API: Easy to implement custom migrations
- CLI tool: Full-featured command-line interface
Installation
Add to your Cargo.toml
:
[]
= { = "0.5", = ["postgres", "sqlite"] }
Quick Start
1. Define a Migration
use *;
;
2. Run Migrations
PostgreSQL
use ;
use PostgresMigrationConnection;
use ;
let mut client = connect?;
let mut conn = new;
let mut runner = new;
runner.add_migration;
let report = runner.run?;
println!;
SQLite
use Connection;
use SqliteMigrationConnection;
use MigrationRunner;
let mut sqlite_conn = open?;
let mut conn = new;
let mut runner = new;
runner.add_migration;
let report = runner.run?;
Migration Files
SQL Migrations
Create migration files with timestamps:
migrations/20240101120000_create_users_table.up.sql
migrations/20240101120000_create_users_table.down.sql
Load from directory:
use FileMigration;
let migrations = from_directory?;
for migration in migrations
Configuration
use ;
let config = MigrationConfig ;
let runner = with_config;
Rollback
// Rollback to a specific version
let report = runner.rollback?;
println!;
Status and Validation
// Get migration status
let statuses = runner.status?;
for status in statuses
// Validate migrations
runner.validate?; // Checks for gaps and checksum mismatches
CLI Usage
Install the CLI tool:
Create a parsql.toml
configuration file:
[]
= "postgresql://localhost/mydb"
[]
= "migrations"
= "schema_migrations"
= true
= false
Commands:
# Create a new migration
# Run pending migrations
# Check migration status
# Rollback to a specific version
# Validate migrations
Advanced Features
Custom Migration Connection
Implement MigrationConnection
for custom database adapters:
use ;
;
Async Support (Currently Limited)
Due to dyn
trait limitations, async support is currently limited. Use sync adapters for now.
Safety Features
- Transaction Safety: Each migration runs in its own transaction by default
- Checksum Verification: Detects if migration files have been modified after being applied
- Gap Detection: Prevents running migrations with missing versions in the sequence
- Idempotency: Skips already applied migrations
Error Handling
All operations return Result<T, MigrationError>
:
match runner.run
License
This project is part of the parsql workspace and shares its license.