Add verbose option to print executed sql statements

pull/135/head
Tony 2018-12-17 09:08:30 +01:00
parent 3c2a65ec01
commit 7b7eaf1c29
3 changed files with 43 additions and 2 deletions

View File

@ -10,8 +10,9 @@ import (
)
var (
flags = flag.NewFlagSet("goose", flag.ExitOnError)
dir = flags.String("dir", ".", "directory with migration files")
flags = flag.NewFlagSet("goose", flag.ExitOnError)
dir = flags.String("dir", ".", "directory with migration files")
verbose = flags.Bool("v", false, "enable verbose mode")
)
func main() {
@ -24,6 +25,10 @@ func main() {
return
}
if *verbose {
goose.SetVerbosity(goose.VerboseOn)
}
switch args[0] {
case "create":
if err := goose.Run("create", nil, *dir, args[1:]...); err != nil {

View File

@ -3,17 +3,35 @@ package goose
import (
"database/sql"
"fmt"
"regexp"
"strconv"
"sync"
)
// VerboseLevel verbose level of the goose library
type VerboseLevel int
const (
// VerboseOff disable the log of the executed SQL statements
VerboseOff VerboseLevel = iota + 1
// VerboseOn log the executed SQL statements
VerboseOn
)
var (
duplicateCheckOnce sync.Once
minVersion = int64(0)
maxVersion = int64((1 << 63) - 1)
timestampFormat = "20060102150405"
verbose = VerboseOff
reMatchSQLComments = regexp.MustCompile(`(--.*)|(((\/\*)+?[\w\W]+?(\*\/)+))`)
)
// SetVerbosity defines the goose verbose level
func SetVerbosity(vl VerboseLevel) {
verbose = vl
}
// Run runs a goose command.
func Run(command string, db *sql.DB, dir string, args ...string) error {
switch command {

View File

@ -153,13 +153,17 @@ func runSQLMigration(db *sql.DB, scriptFile string, v int64, direction bool) err
if useTx {
// TRANSACTION.
printInfo("Begin transaction\n")
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
for _, query := range statements {
printInfo("Executing statement : %s\n", cleanStatement(query))
if _, err = tx.Exec(query); err != nil {
printInfo("Rollback transaction\n")
tx.Rollback()
return err
}
@ -167,21 +171,25 @@ func runSQLMigration(db *sql.DB, scriptFile string, v int64, direction bool) err
if direction {
if _, err := tx.Exec(GetDialect().insertVersionSQL(), v, direction); err != nil {
printInfo("Rollback transaction\n")
tx.Rollback()
return err
}
} else {
if _, err := tx.Exec(GetDialect().deleteVersionSQL(), v); err != nil {
printInfo("Rollback transaction\n")
tx.Rollback()
return err
}
}
printInfo("Commit transaction\n")
return tx.Commit()
}
// NO TRANSACTION.
for _, query := range statements {
printInfo("Executing statement : %s\n", cleanStatement(query))
if _, err := db.Exec(query); err != nil {
return err
}
@ -192,3 +200,13 @@ func runSQLMigration(db *sql.DB, scriptFile string, v int64, direction bool) err
return nil
}
func printInfo(s string, args ...interface{}) {
if verbose == VerboseOn {
log.Printf(s, args...)
}
}
func cleanStatement(s string) string {
return reMatchSQLComments.ReplaceAllString(s, ``)
}