如何在 GoLang 中的不同处理程序上全局共享 MySQL 驱动程序

How to share globally the MySQL driver on different handlers on GoLang

我想从不同的处理程序调用数据库,这是我的 mysql.go: 通用包

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB
var err error

//db connection
func connectDB() {
    db, err = sql.Open("mysql", "root@tcp(localhost:3306)/mysqlapi")
    if err != nil {
        fmt.Println(err.Error())
    }
    defer db.Close()

    //test connection
    err = db.Ping()
    if err != nil {
        fmt.Println(err.Error())
    }

    //table migration
    stmt, err := db.Prepare("CREATE TABLE person (id int NOT NULL AUTO_INCREMENT, first_name varchar(40), last_name varchar(40), PRIMARY KEY (id));")
    if err != nil {
        fmt.Println(err.Error())
    }
    _, err = stmt.Exec()
    if err != nil {
        fmt.Println(err.Error())
    } else {
        fmt.Println("Person Table successfully migrated....")
    }

}

这就是我想做的,但我不知道如何将 db 从普通包调用到不同的包中(我试过 common.db 但它不起作用):

包款

import (
    "github.com/colombia9503/RESTful-Mysql/common"
)

type User struct {
    Id         int
    First_Name string
    Last_Name  string
}

var Users = new(users)

type users struct{}

func (users) SelectAll() ([]*User, error) {
    var users []*User
    rows, err := common.db.Query("select id, first_name, last_name from person;")
    if err != nil {
        panic(err)
    }

    for rows.Next() {
        some code..
    }
    return users, err
}

func (users) SelectOne(id string) (*User, error) {
    some code..
}

func (users) Insert(name, last_name string) (*User, error) {
    some code..
}

func (users) Update(id, name, last_name string) error {
    some code..
}

func (users) Delete(id string) error {
    some code..
}

您需要像这样编写您的数据库变量:

package common

import (
    "database/sql"
    "fmt"

    _ "github.com/go-sql-driver/mysql"
)

var Db *sql.DB
var Err error

在Golang Capital letter means exporting it to out of the package.you 可以详细了解这个here