我在处理使用 MySQL 的 golang Web 应用程序中的连接时遇到问题。
在教程中,我看到数据库交互全部在主函数中处理一次。
但是,在现实世界中,每个http请求都将与数据库交互 - 我应该在哪里保存sql。Open() 和 durer sql。关闭()?这是我的代码。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"html/template"
"net/http"
)
var db *sql.DB
var pageTemplate = template.Must(template.ParseFiles("index.html"))
type Items []string
func main() {
db, err := sql.Open("mysql",
"username:passwordl@tcp(127.0.0.1:3306)/databasename")
checkErr(err)
defer db.Close()
_, err = db.Exec(
`
CREATE TABLE IF NOT EXISTS items (
item_id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
item TEXT
);
`)
checkErr(err)
http.HandleFunc("/", mainHandler)
http.ListenAndServe(":3000", nil)
}
func mainHandler(w http.ResponseWriter, r *http.Request) {
var item string
var items Items
stmt, err := db.Prepare("select item from items")
checkErr(err)
defer stmt.Close()
rows, err := stmt.Query()
checkErr(err)
defer rows.Close()
for rows.Next() {
err := rows.Scan(&item)
checkErr(err)
items = append(items, item)
}
if err = rows.Err(); err != nil {
checkErr(err)
}
pageTemplate.Execute(w, items)
}
func checkErr(err error) {
if err != nil {
fmt.Println(err)
}
}
我在线收到运行时错误:
stmt, err := db.Prepare("select item from items")
大概是因为 db 在主函数之外无法识别。我应该改用sql吗?Open() 在每个 url 处理程序上?
如果问题模棱两可,请道歉。
问题是,你在主函数中重新声明了 db。
改变:
db, err := sql.Open("mysql",
自:
var err error
db, err = sql.Open("mysql",
此外,请考虑阅读有关应用中数据库访问的不同组织方法。这是一本很棒的读物:http://www.alexedwards.net/blog/organising-database-access
在
db, err := ...
语句运算符:=
将定义一个新变量并隐藏具有相同名称的全局变量。