I'm running a list of sql files. The list of files comes from the same sqlite3 db that I'm going to execute sql against, hence there's only one db connection. If I don't kill the loop over sql files it will return "database is locked" error for every file starting with the first. Things that didn't work:
No effect: Adding rows.Close() from Sqlite3 error: database is locked in golang
Removing sqlx and using database/sql didn't change anything.
No effect: Having Navicat open or closed.
Restarting my laptop, no effect.
No effect: Dumping database to a new file then running the process against the new file.
package main import ( "database/sql" "fmt" "io/ioutil" "os" _ "github.com/mattn/go-sqlite3" ) func main() { dbPath := "/Users/darianhickman/Documents/wc_study/history.db" db, err := sql.Open("sqlite3", dbPath) if err != nil { println("db open failed.", err) os.Exit(-1) } defer db.Close() // qry := `select list_folder||'/'|| sql_file as script from run_list where 'order' > 0 ORDER BY 'order'; ` qry := `select list_folder||'/'|| sql_file as script from run_list where run_order > 0 ORDER BY run_order;` scripts, err := db.Query(qry) if err != nil { println("query failed ", qry) os.Exit(-1) } defer scripts.Close() var file string for scripts.Next() { err = scripts.Scan(&file) if err != nil { println(err) } println(file[len(file)-80:]) sqlScript, err := ioutil.ReadFile(file) if err != nil { println("reading script file failed\n", file) } if _, err := db.Exec(string(sqlScript)); err != nil { fmt.Println(string(sqlScript[:80])) fmt.Println(err) } else { fmt.Println("Success ", string(sqlScript[:80])) } }
}