为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
茅侃侃 2023-01-03 11:29:48
我正在运行一个 sql 文件列表。文件列表来自同一个 sqlite3 数据库,我将对其执行 sql,因此只有一个数据库连接。如果我不终止 sql 文件的循环,它将为从第一个文件开始的每个文件返回“数据库已锁定”错误。不起作用的事情:无效:从Sqlite3 添加 rows.Close() 错误:数据库在 golang 中被锁定删除 sqlx 并使用 database/sql 没有任何改变。无效:打开或关闭 Navicat。重新启动我的笔记本电脑,没有效果。无效:将数据库转储到新文件,然后针对新文件运行进程。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]))     } }}
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

根据官方文档


When you get a database is locked, please use the following options.


Add to DSN: cache=shared


Example:


  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)


查看完整回答
反对 回复 2023-01-03
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我放弃了在执行脚本时阅读脚本列表并且成功了。


package main


import (

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

        }

    }


}



查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信