From e494d6e38100554a16afeaa2d127a281edeb0863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Fri, 20 Mar 2020 19:56:06 -0700 Subject: [PATCH] Check during startup if the database schema is up to date --- cli/cli.go | 4 ++++ database/migration.go | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/cli/cli.go b/cli/cli.go index 279e0523..393d9b4e 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -115,6 +115,10 @@ func Parse() { return } + if err := database.IsSchemaUpToDate(db); err != nil { + logger.Fatal(`You must run the SQL migrations, %v`, err) + } + store := storage.NewStorage(db) if flagResetFeedErrors { diff --git a/database/migration.go b/database/migration.go index c9abf0e8..7bff6e21 100644 --- a/database/migration.go +++ b/database/migration.go @@ -17,7 +17,7 @@ const schemaVersion = 28 // Migrate executes database migrations. func Migrate(db *sql.DB) { var currentVersion int - db.QueryRow(`select version from schema_version`).Scan(¤tVersion) + db.QueryRow(`SELECT version FROM schema_version`).Scan(¤tVersion) fmt.Println("Current schema version:", currentVersion) fmt.Println("Latest schema version:", schemaVersion) @@ -43,7 +43,7 @@ func Migrate(db *sql.DB) { logger.Fatal("[Migrate] %v", err) } - if _, err := tx.Exec(`insert into schema_version (version) values($1)`, version); err != nil { + if _, err := tx.Exec(`INSERT INTO schema_version (version) VALUES ($1)`, version); err != nil { tx.Rollback() logger.Fatal("[Migrate] %v", err) } @@ -53,3 +53,13 @@ func Migrate(db *sql.DB) { } } } + +// IsSchemaUpToDate checks if the database schema is up to date. +func IsSchemaUpToDate(db *sql.DB) error { + var currentVersion int + db.QueryRow(`SELECT version FROM schema_version`).Scan(¤tVersion) + if currentVersion != schemaVersion { + return fmt.Errorf(`database schema is not up to date: current=v%d expected=v%d`, currentVersion, schemaVersion) + } + return nil +}