drizzle_cli/commands/
migrate.rs

1//! Migrate command implementation
2//!
3//! Runs pending migrations against the database.
4
5use crate::config::DrizzleConfig;
6use crate::error::CliError;
7use crate::output;
8
9/// Run the migrate command
10pub fn run(config: &DrizzleConfig, db_name: Option<&str>) -> Result<(), CliError> {
11    let db = config.database(db_name)?;
12
13    if !config.is_single_database() {
14        let name = db_name.unwrap_or("(default)");
15        println!("{}: {}", output::label("Database"), name);
16    }
17
18    println!("{}", output::heading("Running migrations..."));
19    println!();
20
21    let out_dir = db.migrations_dir();
22
23    // Check if migrations directory exists
24    if !out_dir.exists() {
25        println!("  {}", output::warning("No migrations directory found."));
26        println!("  Run 'drizzle generate' to create your first migration.");
27        return Ok(());
28    }
29
30    // Get credentials
31    let credentials = db.credentials()?;
32
33    let credentials = match credentials {
34        Some(c) => c,
35        None => {
36            println!("{}", output::warning("No database credentials configured."));
37            println!();
38            println!("Add credentials to your drizzle.config.toml:");
39            println!();
40            println!("  {}", output::muted("[dbCredentials]"));
41            println!("  {}", output::muted("url = \"./dev.db\""));
42            println!();
43            println!("Or use an environment variable:");
44            println!();
45            println!("  {}", output::muted("[dbCredentials]"));
46            println!("  {}", output::muted("url = { env = \"DATABASE_URL\" }"));
47            return Ok(());
48        }
49    };
50
51    // Run migrations
52    let result = crate::db::run_migrations(
53        &credentials,
54        db.dialect,
55        out_dir,
56        db.migrations_table(),
57        db.migrations_schema(),
58    )?;
59
60    if result.applied_count == 0 {
61        println!("  {}", output::success("No pending migrations."));
62    } else {
63        println!(
64            "  {} {} migration(s):",
65            output::success("Applied"),
66            result.applied_count
67        );
68        for hash in &result.applied_migrations {
69            println!("    {} {}", output::label("->"), hash);
70        }
71    }
72
73    println!();
74    println!("{}", output::success("Migrations complete!"));
75
76    Ok(())
77}