46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
package sqlite
|
||
|
||
import (
|
||
"database/sql"
|
||
"fmt"
|
||
"io/ioutil"
|
||
"path/filepath"
|
||
"strings"
|
||
)
|
||
|
||
func RunMigrations(db *sql.DB, migrationsPath string) error {
|
||
// Находим все .up.sql файлы
|
||
files, err := filepath.Glob(filepath.Join(migrationsPath, "*.up.sql"))
|
||
if err != nil {
|
||
return fmt.Errorf("failed to find migrations: %w", err)
|
||
}
|
||
|
||
for _, file := range files {
|
||
fmt.Printf("Applying migration: %s\n", file)
|
||
|
||
content, err := ioutil.ReadFile(file)
|
||
if err != nil {
|
||
return fmt.Errorf("failed to read migration file %s: %w", file, err)
|
||
}
|
||
|
||
// Разделяем SQL statements по точке с запятой
|
||
statements := strings.Split(string(content), ";")
|
||
|
||
for _, stmt := range statements {
|
||
stmt = strings.TrimSpace(stmt)
|
||
if stmt == "" {
|
||
continue
|
||
}
|
||
|
||
// Выполняем SQL
|
||
if _, err := db.Exec(stmt); err != nil {
|
||
// Игнорируем ошибку "table already exists"
|
||
if !strings.Contains(err.Error(), "already exists") {
|
||
return fmt.Errorf("failed to execute migration %s: %w\nSQL: %s", file, err, stmt)
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return nil
|
||
} |