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

关键点说明:

  1. db 变量在包级别声明,使用 var db *sql.DB
  2. InitDB 函数中直接对包级变量 db 赋值
  3. 其他函数如 InsertUserGetUser 直接使用包级 db 变量,无需重新打开连接
  4. 确保只调用一次 InitDB,通常在程序启动时

这样修改后,整个包中的所有函数都可以共享同一个数据库连接,避免了重复打开连接的问题。

回到顶部