不涉及并发线程时如何修复“数据库被锁定”?高朗,sqlite3

我正在运行一个 sql 文件列表。文件列表来自同一个 sqlite3 数据库,我将对其执行 sql,因此只有一个数据库连接。如果我不终止 sql 文件的循环,它将为从第一个文件开始的每个文件返回“数据库已锁定”错误。不起作用的事情:

  1. 无效:从Sqlite3 添加 rows.Close() 错误:数据库在 golang 中被锁定

  2. 删除 sqlx 并使用 database/sql 没有任何改变。

  3. 无效:打开或关闭 Navicat。

  4. 重新启动我的笔记本电脑,没有效果。

  5. 无效:将数据库转储到新文件,然后针对新文件运行进程。

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]))

     }

 }

}


茅侃侃
浏览 128回答 2
2回答

翻过高山走不出你

根据官方文档:When you get a database is locked, please use the following options.Add to DSN: cache=sharedExample:  db, err := sql.Open("sqlite3", "file:locked.sqlite?cache=shared")Next, please set the database connections of the SQL package to 1:  db.SetMaxOpenConns(1)

红颜莎娜

我放弃了在执行脚本时阅读脚本列表并且成功了。package mainimport (    "fmt"    "io/ioutil"    "github.com/jmoiron/sqlx"    _ "github.com/mattn/go-sqlite3")func main() {    // dbPath := "file:/Users/darianhickman/Documents/wc_study/history.db?cache=shared"    dbPath := "file:/Users/darianhickman/Documents/wc_study/history.db"    db := sqlx.MustConnect("sqlite3", dbPath)    defer db.Close()    // db.SetMaxOpenConns(1)    // 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("script qry failed ", qry)    }    defer scripts.Close()    var files []string    var file string    // Giving up on executing sql scripts while reading the query of scripts.    for scripts.Next() {        err = scripts.Scan(&file)        if err != nil {            println(err)        } else {            files = append(files, file)        }    }    for _, file := range files {        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]))        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go