diff --git a/main.go b/main.go index 28096f2..83829de 100644 --- a/main.go +++ b/main.go @@ -119,8 +119,11 @@ func main() { var err error db, err = gorm.Open(config.Db.GetDialector(), &gorm.Config{Logger: gormLogger}) if config.Db.Dialect == "sqlite3" { - db.Raw("PRAGMA foreign_keys = ON;") - db.DisableForeignKeyConstraintWhenMigrating = true + db.Exec("PRAGMA foreign_keys = ON;") + if !utils.IsCleanDB(db) && !utils.HasConstraints(db) { + db.DisableForeignKeyConstraintWhenMigrating = true + logbuch.Warn("using existing sqlite database without foreign key constraints and no ability to migrate, functionality may be limited") + } } if config.IsDev() { diff --git a/utils/db.go b/utils/db.go new file mode 100644 index 0000000..e8469a4 --- /dev/null +++ b/utils/db.go @@ -0,0 +1,32 @@ +package utils + +import ( + "github.com/emvi/logbuch" + "gorm.io/gorm" +) + +func IsCleanDB(db *gorm.DB) bool { + if db.Dialector.Name() == "sqlite" { + var count int64 + if err := db.Raw("SELECT count(*) from sqlite_master WHERE type = 'table'").Scan(&count).Error; err != nil { + logbuch.Error("failed to check if database is clean - '%v'", err) + return false + } + return count == 0 + } + logbuch.Warn("IsCleanDB is not yet implemented for dialect '%s'", db.Dialector.Name()) + return false +} + +func HasConstraints(db *gorm.DB) bool { + if db.Dialector.Name() == "sqlite" { + var count int64 + if err := db.Raw("SELECT count(*) from sqlite_master WHERE sql LIKE '%CONSTRAINT%'").Scan(&count).Error; err != nil { + logbuch.Error("failed to check if database has constraints - '%v'", err) + return false + } + return count != 0 + } + logbuch.Warn("HasForeignKeyConstraints is not yet implemented for dialect '%s'", db.Dialector.Name()) + return false +}