From 1b409bd389e727e941ef29f973c1537bdaade232 Mon Sep 17 00:00:00 2001 From: Max Vorobev Date: Fri, 28 Jul 2023 20:27:05 +0300 Subject: [PATCH] Automatically infer migration type --- sqlx-cli/README.md | 10 ++++------ sqlx-cli/src/migrate.rs | 11 ++++------- sqlx-core/src/migrate/error.rs | 1 + sqlx-core/src/migrate/migration_type.rs | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/sqlx-cli/README.md b/sqlx-cli/README.md index 60ed44a6f4..118bb1a00f 100644 --- a/sqlx-cli/README.md +++ b/sqlx-cli/README.md @@ -72,7 +72,7 @@ sqlx migrate info --source ../relative/migrations ### Reverting Migrations -If you would like to create _reversible_ migrations with corresponding "up" and "down" scripts, you use the `-r` flag when creating new migrations: +If you would like to create _reversible_ migrations with corresponding "up" and "down" scripts, you use the `-r` flag when creating the first migration: ```bash $ sqlx migrate add -r @@ -94,14 +94,12 @@ $ sqlx migrate revert Applied 20211001154420/revert ``` -**Note**: attempting to mix "simple" migrations with reversible migrations with result in an error. +**Note**: All the subsequent migrations will be reversible as well. ```bash $ sqlx migrate add -Creating migrations/20211001154420_.sql - -$ sqlx migrate add -r -error: cannot mix reversible migrations with simple migrations. All migrations should be reversible or simple migrations +Creating migrations/20211001154420_.up.sql +Creating migrations/20211001154420_.down.sql ``` ### Enable building in "offline mode" with `query!()` diff --git a/sqlx-cli/src/migrate.rs b/sqlx-cli/src/migrate.rs index 4272442ae5..ef18051369 100644 --- a/sqlx-cli/src/migrate.rs +++ b/sqlx-cli/src/migrate.rs @@ -115,17 +115,14 @@ pub async fn add( .unwrap_or(false); let migrator = Migrator::new(Path::new(migration_source)).await?; - // This checks if all existing migrations are of the same type as the reversible flag passed - for migration in migrator.iter() { - if migration.migration_type.is_reversible() != reversible { - bail!(MigrateError::InvalidMixReversibleAndSimple); - } - } + // Type of newly created migration will be the same as the first one + // or reversible flag if this is the first migration + let migration_type = MigrationType::infer(&migrator, reversible); let ordering = MigrationOrdering::infer(sequential, timestamp, &migrator); let file_prefix = ordering.file_prefix(); - if reversible { + if migration_type.is_reversible() { create_file( migration_source, &file_prefix, diff --git a/sqlx-core/src/migrate/error.rs b/sqlx-core/src/migrate/error.rs index d76f97387f..0463210cf5 100644 --- a/sqlx-core/src/migrate/error.rs +++ b/sqlx-core/src/migrate/error.rs @@ -24,6 +24,7 @@ pub enum MigrateError { #[error("migration {0} is newer than the latest applied migration {1}")] VersionTooNew(i64, i64), + #[deprecated = "migration types are now inferred"] #[error("cannot mix reversible migrations with simple migrations. All migrations should be reversible or simple migrations")] InvalidMixReversibleAndSimple, diff --git a/sqlx-core/src/migrate/migration_type.rs b/sqlx-core/src/migrate/migration_type.rs index 5fe298ae9f..de2b019307 100644 --- a/sqlx-core/src/migrate/migration_type.rs +++ b/sqlx-core/src/migrate/migration_type.rs @@ -1,3 +1,5 @@ +use super::Migrator; + /// Migration Type represents the type of migration #[derive(Debug, Copy, Clone, PartialEq)] pub enum MigrationType { @@ -71,4 +73,17 @@ impl MigrationType { MigrationType::ReversibleDown => "-- Add down migration script here\n", } } + + pub fn infer(migrator: &Migrator, reversible: bool) -> MigrationType { + match migrator.iter().next() { + Some(first_migration) => first_migration.migration_type, + None => { + if reversible { + MigrationType::ReversibleUp + } else { + MigrationType::Simple + } + } + } + } }