Drop tables instead of truncating tables. (#1224)

This commit is contained in:
Googol Lee
2025-06-26 22:19:09 +02:00
committed by GitHub
parent a8edb30ae4
commit 0192e4e640
5 changed files with 32 additions and 64 deletions

View File

@@ -2,6 +2,7 @@ package database
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"log" "log"
"net/url" "net/url"
@@ -204,50 +205,16 @@ func MigrateDatabase(db *gorm.DB) error {
} }
func ClearDatabase(db *gorm.DB) error { func ClearDatabase(db *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error { var errs []error
dbDriver := drivers.DatabaseDriverFromEnv()
if dbDriver == drivers.MYSQL {
if err := tx.Exec("SET FOREIGN_KEY_CHECKS = 0;").Error; err != nil {
return err
}
}
if err := clearTables(tx, dbDriver); err != nil {
return err
}
if dbDriver == drivers.MYSQL {
if err := tx.Exec("SET FOREIGN_KEY_CHECKS = 1;").Error; err != nil {
return err
}
}
return nil
})
}
func clearTables(tx *gorm.DB, dbDriver drivers.DatabaseDriverType) error {
dryRun := tx.Session(&gorm.Session{DryRun: true})
for _, model := range database_models { for _, model := range database_models {
// get table name of model structure if err := db.Migrator().DropTable(model); err != nil {
table := dryRun.Find(model).Statement.Table errs = append(errs, err)
}
}
switch dbDriver { if err := errors.Join(errs...); err != nil {
case drivers.POSTGRES: return fmt.Errorf("drop tables error: %w", err)
if err := tx.Exec(fmt.Sprintf("TRUNCATE TABLE %s CASCADE", table)).Error; err != nil {
return err
}
case drivers.MYSQL:
if err := tx.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)).Error; err != nil {
return err
}
case drivers.SQLITE:
if err := tx.Exec(fmt.Sprintf("DELETE FROM %s", table)).Error; err != nil {
return err
}
}
} }
return nil return nil
} }

View File

@@ -99,6 +99,7 @@ func (a *Album) Thumbnail(db *gorm.DB) (*Media, error) {
) )
SELECT * FROM media SELECT * FROM media
WHERE media.album_id IN (SELECT id FROM sub_albums) WHERE media.album_id IN (SELECT id FROM sub_albums)
ORDER BY media.id
LIMIT 1 LIMIT 1
` `

View File

@@ -1,9 +1,15 @@
package media_type package media_type
import ( import (
"flag"
"testing" "testing"
) )
func init() {
// Avoid panic with providing flags in `test_utils/integration_setup.go`.
flag.CommandLine.Init("media_type", flag.ContinueOnError)
}
type boolImage bool type boolImage bool
const isImage boolImage = true const isImage boolImage = true

View File

@@ -72,7 +72,7 @@ func DatabaseTest(t *testing.T) *gorm.DB {
t.Skip("Database integration tests disabled") t.Skip("Database integration tests disabled")
} }
if err := test_dbm.SetupOrReset(); err != nil { if err := test_dbm.SetupAndReset(); err != nil {
t.Fatalf("failed to setup or reset test database: %v", err) t.Fatalf("failed to setup or reset test database: %v", err)
} }

View File

@@ -1,8 +1,9 @@
package test_utils package test_utils
import ( import (
"fmt"
"github.com/photoview/photoview/api/database" "github.com/photoview/photoview/api/database"
"github.com/pkg/errors"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/logger" "gorm.io/gorm/logger"
) )
@@ -11,12 +12,14 @@ type TestDBManager struct {
DB *gorm.DB DB *gorm.DB
} }
func (dbm *TestDBManager) SetupOrReset() error { func (dbm *TestDBManager) SetupAndReset() error {
if dbm.DB == nil { if dbm.DB == nil {
return dbm.setup() if err := dbm.setup(); err != nil {
} else { return fmt.Errorf("setup db error: %w", err)
return dbm.reset()
} }
}
return dbm.reset()
} }
func (dbm *TestDBManager) Close() error { func (dbm *TestDBManager) Close() error {
@@ -24,13 +27,9 @@ func (dbm *TestDBManager) Close() error {
return nil return nil
} }
if err := dbm.reset(); err != nil {
return err
}
sqlDB, err := dbm.DB.DB() sqlDB, err := dbm.DB.DB()
if err != nil { if err != nil {
return errors.Wrap(err, "get db instance when closing test database") return fmt.Errorf("get db instance when closing test database error: %w", err)
} }
sqlDB.Close() sqlDB.Close()
@@ -45,26 +44,21 @@ func (dbm *TestDBManager) setup() error {
} }
db, err := database.ConfigureDatabase(&config) db, err := database.ConfigureDatabase(&config)
if err != nil { if err != nil {
return errors.Wrap(err, "configure test database") return fmt.Errorf("configure test database error: %w", err)
}
if err := database.MigrateDatabase(db); err != nil {
return errors.Wrap(err, "migrate test database")
} }
dbm.DB = db dbm.DB = db
if err := dbm.reset(); err != nil {
return err
}
return nil return nil
} }
func (dbm *TestDBManager) reset() error { func (dbm *TestDBManager) reset() error {
if err := database.ClearDatabase(dbm.DB); err != nil { if err := database.ClearDatabase(dbm.DB); err != nil {
return errors.Wrap(err, "reset test database") return fmt.Errorf("clean database error: %w", err)
}
if err := database.MigrateDatabase(dbm.DB); err != nil {
return fmt.Errorf("migrate database error: %w", err)
} }
return nil return nil