diff --git a/database/drivers/sqlitecgo/sqlitecgo.go b/database/drivers/sqlitecgo/sqlitecgo.go index 39d456f..f7e6434 100644 --- a/database/drivers/sqlitecgo/sqlitecgo.go +++ b/database/drivers/sqlitecgo/sqlitecgo.go @@ -50,3 +50,9 @@ func (d *Driver) New(core *database.Core, node *database.ConfigNode) (database.D func (d *Driver) GetChars() (charLeft string, charRight string) { return quoteChar, quoteChar } + +// GetMigration returns a Migration instance implementing the Migration interface. +// Note: sqlitecgo driver does not have migration support yet, returns nil. +func (d *Driver) GetMigration() database.Migration { + return nil +} diff --git a/database/gdb_migration_auto.go b/database/gdb_migration_auto.go index 045bd3d..b31bcda 100644 --- a/database/gdb_migration_auto.go +++ b/database/gdb_migration_auto.go @@ -9,6 +9,8 @@ package database import ( "context" "fmt" + "os" + "path/filepath" "reflect" "strings" "time" @@ -46,6 +48,13 @@ func (am *AutoMigrateCore) migrateEntity(ctx context.Context, entity any) error return fmt.Errorf("no columns found for table %s", tableName) } + // For SQLite, ensure the database file directory exists + if am.db.GetConfig().Type == "sqlite" { + if err := am.ensureSQLiteDirectory(); err != nil { + return fmt.Errorf("failed to prepare SQLite database: %w", err) + } + } + // Check if table exists hasTable, err := am.db.HasTable(ctx, tableName) if err != nil { @@ -450,3 +459,41 @@ func IsZeroValue(v any) bool { } return false } + +// ensureSQLiteDirectory ensures the SQLite database file directory exists. +func (am *AutoMigrateCore) ensureSQLiteDirectory() error { + config := am.db.GetConfig() + if config.Type != "sqlite" { + return nil + } + + // Get the database file path from config.Name or config.Link + dbPath := config.Name + if dbPath == "" && config.Link != "" { + // Parse link format: sqlite::@file(./data/company.db) + if strings.Contains(config.Link, "@file(") { + start := strings.Index(config.Link, "@file(") + 6 + end := strings.Index(config.Link[start:], ")") + if end > 0 { + dbPath = config.Link[start : start+end] + } + } + } + + if dbPath == "" { + return fmt.Errorf("SQLite database path is empty") + } + + // Get directory path + dir := filepath.Dir(dbPath) + + // Check if directory exists + if _, err := os.Stat(dir); os.IsNotExist(err) { + // Create directory with all parents + if err := os.MkdirAll(dir, 0755); err != nil { + return fmt.Errorf("failed to create directory %s: %w", dir, err) + } + } + + return nil +}