Golang中如何在包级别打开数据库连接
Golang中如何在包级别打开数据库连接 我的项目结构如下:
-project
--main.go
--user
---db.go
在 db.go 文件中,我有一个用于打开数据库连接的函数
func InitDB(dbName string) {
db, err := sql.Open("mysql", dbName)
if err != nil {
log.Fatal("Retard alert connection to db")
}
if err = db.Ping(); err != nil {
log.Fatal("Error Ping")
}
}
我在 main 函数的最开始调用它
func main() {
userStaff.InitDB("root:Yfehsp2203@tcp(127.0.0.1:3306)/golangdb")
http.HandleFunc("/", index)
http.HandleFunc("/login", login)
http.HandleFunc("/signup", signUp)
http.ListenAndServe(":8080", nil)
}
另外在 db.go 中我还有另一个函数,在这个函数中我想向数据库插入一些值。 如果不重新打开连接就无法工作,只有当我再次写入以下代码时才能正常工作:
db, err := sql.Open("mysql", myDBname)
if err != nil {
log.Fatal("Retard alert connection to db")
}
我怎样才能只在 db.go 中打开一次数据库连接,并在任何函数中使用它?
更多关于Golang中如何在包级别打开数据库连接的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
文件:db.go
package funcs
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"time"
)
var DbConn *sql.DB
func DbOpenConn() (*sql.DB, error) {
DbConn, err := sql.Open("mysql", "your_connection_string")
CheckErr(err)
DbConn.SetMaxIdleConns(0)
DbConn.SetMaxOpenConns(200)
DbConn.SetConnMaxLifetime(time.Second * 5)
return DbConn, err
}
文件:test.go
func Test_Index(w http.ResponseWriter, r *http.Request) {
db := funcs.DbConn
//... 你的代码
}
更多关于Golang中如何在包级别打开数据库连接的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
andersk:
不幸的是它不起作用 db.go
var DbConn *sql.DB
func InitDB(dbName string) (*sql.DB, error) {
DbConn, err := sql.Open("mysql", dbName)
if err != nil {
log.Fatal("■■■■■■ Alert")
}
DbConn.SetMaxIdleConns(0)
DbConn.SetMaxOpenConns(200)
DbConn.SetConnMaxLifetime(0)
return DbConn, err
}
func Login(r *http.Request) int {
email := r.FormValue("email")
password := r.FormValue("password")
rows, err := DbConn.Query("SELECT userpassword FROM userinfo WHERE useremail=?", email)
defer rows.Close()
if err != nil {
panic("SELECT ERROR")
}
}
以下是我在 main.go 中初始化数据库的方式
func init() {
tpl = template.Must(template.ParseGlob("templates/*"))
userStaff.InitDB("root:Yfehsp2203@tcp(127.0.0.1:3306)/golangdb")
}
在Go语言中,要实现包级别的数据库连接共享,你需要将数据库连接对象声明为包级变量,并在初始化函数中赋值。以下是修改后的代码示例:
在 db.go 文件中:
package userStaff
import (
"database/sql"
"log"
_ "github.com/go-sql-driver/mysql"
)
// 声明包级变量
var db *sql.DB
// 初始化数据库连接
func InitDB(dbName string) {
var err error
db, err = sql.Open("mysql", dbName)
if err != nil {
log.Fatal("Failed to connect to database:", err)
}
if err = db.Ping(); err != nil {
log.Fatal("Failed to ping database:", err)
}
}
// 在其他函数中使用全局db变量
func InsertUser(name string) error {
_, err := db.Exec("INSERT INTO users (name) VALUES (?)", name)
return err
}
// 查询示例
func GetUser(id int) (string, error) {
var name string
err := db.QueryRow("SELECT name FROM users WHERE id = ?", id).Scan(&name)
return name, err
}
在 main.go 文件中:
package main
import (
"your-project/user"
"net/http"
)
func main() {
userStaff.InitDB("root:Yfehsp2203@tcp(127.0.0.1:3306)/golangdb")
http.HandleFunc("/", index)
http.HandleFunc("/login", login)
http.HandleFunc("/signup", signUp)
http.ListenAndServe(":8080", nil)
}
关键点说明:
db变量在包级别声明,使用var db *sql.DB- 在
InitDB函数中直接对包级变量db赋值 - 其他函数如
InsertUser和GetUser直接使用包级db变量,无需重新打开连接 - 确保只调用一次
InitDB,通常在程序启动时
这样修改后,整个包中的所有函数都可以共享同一个数据库连接,避免了重复打开连接的问题。

