From 402488daae37be274984c6bb933de65cb8558c14 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Sun, 1 Oct 2023 03:39:06 +0200 Subject: [PATCH] improve migration error messages --- CHANGELOG.md | 1 + Cargo.lock | 16 ++++++++-------- Cargo.toml | 2 +- src/webserver/database/mod.rs | 18 +++++++++++++++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f34ffe94..8e71a2a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ - set a custom `search_path`, `application_name` or other variables in PostgreSQL - create temporary tables that will be available to all SQLPage queries but will not be persisted in the database - [`ATTACH`](https://www.sqlite.org/lang_attach.html) a database in SQLite to query multiple database files at once + - Better error messages. SQLPage displays a more precise and useful message when an error occurs, and displays the position in the SQL statement where the error occured. Incorrect error messages on invalid migrations are also fixed. ## 0.11.0 (2023-09-17) - Support for **environment variables** ! You can now read environment variables from sql code using `sqlpage.environment_variable('VAR_NAME')`. diff --git a/Cargo.lock b/Cargo.lock index 44ecaef9..d1628f18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2303,9 +2303,9 @@ dependencies = [ [[package]] name = "sqlx-core-oldapi" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc483a537156b353ddf3548232028b365598156e3e62602358c54e06d82eb38" +checksum = "b7068b79d3eec6cf68e88b4ed25dbb0538d3eaef523f1f5f00aadbbf4aafe5e2" dependencies = [ "ahash 0.8.3", "atoi", @@ -2366,9 +2366,9 @@ dependencies = [ [[package]] name = "sqlx-macros-oldapi" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf693228f81847c21d0743d4b00ddafe6a06f31d83bf4a3ba02fe956182f45fc" +checksum = "0f58e32897a223173c33a87834a7c364350a89f85a50d24f1876d6c1269d1430" dependencies = [ "dotenvy", "either", @@ -2386,9 +2386,9 @@ dependencies = [ [[package]] name = "sqlx-oldapi" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5bed27ca64ed35c7a676ebb520718a6474f1859d596102e0a21a1212bf60d5a" +checksum = "41c7a081f7e0b3cd90e05b0f9be0fdda26512f577857c06b3182a37f4f403363" dependencies = [ "sqlx-core-oldapi", "sqlx-macros-oldapi", @@ -2396,9 +2396,9 @@ dependencies = [ [[package]] name = "sqlx-rt-oldapi" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b872dd9594d072bcf74dfed085617b88e120751f0178ce3b1bb76c0598137d" +checksum = "0216514f2b41f2d711e3f539aa659a77c113852b789acdc39ea80792cf3d3b8f" dependencies = [ "once_cell", "tokio", diff --git a/Cargo.toml b/Cargo.toml index e27e70de..7c2126c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ panic = "abort" codegen-units = 2 [dependencies] -sqlx = { package = "sqlx-oldapi", version = "0.6.13", features = ["any", "runtime-actix-rustls", "sqlite", "postgres", "mysql", "mssql", "chrono", "json" ] } +sqlx = { package = "sqlx-oldapi", version = "0.6.14", features = ["any", "runtime-actix-rustls", "sqlite", "postgres", "mysql", "mssql", "chrono", "json" ] } chrono = "0.4.23" actix-web = { version = "4", features = ["rustls", "cookies"] } percent-encoding = "2.2.0" diff --git a/src/webserver/database/mod.rs b/src/webserver/database/mod.rs index 3a1a462c..540a4f67 100644 --- a/src/webserver/database/mod.rs +++ b/src/webserver/database/mod.rs @@ -22,7 +22,7 @@ pub use sql::ParsedSqlFile; use sqlx::any::{ AnyArguments, AnyConnectOptions, AnyKind, AnyQueryResult, AnyRow, AnyStatement, AnyTypeInfo, }; -use sqlx::migrate::Migrator; +use sqlx::migrate::{MigrateError, Migrator}; use sqlx::pool::{PoolConnection, PoolOptions}; use sqlx::query::Query; use sqlx::{ @@ -82,8 +82,20 @@ pub async fn apply_migrations(db: &Database) -> anyhow::Result<()> { m.description ); } - migrator.run(&db.connection).await.with_context(|| { - format!("There is an error in the database migrations in {MIGRATIONS_DIR:?}") + migrator.run(&db.connection).await.map_err(|err| { + match err { + MigrateError::Execute(n, source) => { + let migration = migrator.iter().find(|&m| m.version == n).unwrap(); + anyhow::Error::new(source).context(format!( + "Failed to apply migration [{:04}] {:?} {}", + migration.version, migration.migration_type, migration.description + )) + } + source => anyhow::Error::new(source), + } + .context(format!( + "Failed to apply database migrations from {MIGRATIONS_DIR:?}" + )) })?; Ok(()) }