drizzle_cli/commands/
migrate.rs1use crate::config::DrizzleConfig;
6use crate::error::CliError;
7use crate::output;
8
9pub 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 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 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 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}