数据库被锁定(延迟行不起作用)

xao*_*_xv 5 sqlite go

我的Golang项目中的SQLite3有问题。我想将数据插入数据库,但这给了我错误database is locked。我知道这是同样的问题(Sqlite3错误:数据库被锁定在golang中),但是从那里得到的答案无效。我不知道我在做什么错。这是我的代码:

var (
    tpl   *template.Template
    db, _ = sql.Open("sqlite3", "database/pastozbior.db")
)
func main() {
    http.HandleFunc("/", addCopypasta)
    http.ListenAndServe(":8000", nil)
} 
func getCopypasta() []Copypasta {
    copypastaList := []Copypasta{}
    var title, body string

    rows, _ := db.Query("select title, body from copypasta")
    for rows.Next() {
        rows.Scan(&title, &body)
        copypastaList = append(copypastaList, Copypasta{title, body})
    }
    defer rows.Close()
    return copypastaList
}

func addCopypasta(w http.ResponseWriter, r *http.Request) {
    tpl.ExecuteTemplate(w, "main.html", nil)

    if r.Method == "POST" {
        r.ParseForm()
        // add copypasta to database
        stmt, err := db.Prepare("INSERT INTO copypasta(title, body, approved) values(?,?,0)")
        if err != nil {
            log.Fatal(err)
        }

        res, err := stmt.Exec("testTitle", "TestBody")
        if err != nil {
            log.Fatal(err)
        }
        id, err := res.LastInsertId()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(id)

    }
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助!

Ber*_*ees 6

您必须在创建行的行的正下方放置defer rows.Close()。因为,在您做某事时出现紧急情况的情况下,永远不会达到延迟,行也永远不会关闭,然后会发生这种错误情况。在您的代码中,您放弃了defer-construct优于其他编程环境的巨大优势。