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

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

问题描述:

I want to call db from the different handlers, This is my mysql.go: package common

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

}

this is what i want to do, but i don't know how i call db from common package into a different package (i tried common.db but it doesn't works):

package models

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

我想从其他处理程序中调用db,这是我的mysql.go: package常见 p>

  import(
“数据库/ sql” 
“ fmt” 
 
 _“ github.com/go-sql-driver/mysql"
)

var db  * sql.DB 
var err错误
 
 // db连接
func connectDB(){
 db,err = sql.Open(“ mysql”,“ root @ tcp(localhost:3306)/ mysqlapi”)\  n如果err!= nil {
 fmt.Println(err.Error())
} 
延迟db.Close()
 
 //测试连接
 err = db.Ping()
  err!= nil {
 fmt.Println(err.Error())
} 
 
 //表迁移
 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()
,如果错误!= nil {
 fmt.Println(err.Error())
}否则{
 fmt.Println(“人员表已成功迁移。...”)
}  
 
} 
 代码>  PRE> 
 
 

这是我想要做的,但是我不知道如何将db从普通包调用到另一个包中(我尝试了common.db,但它不起作用): p>

包模型 p>

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

type用户结构{
 ID int 
 First_Name 字符串
姓氏字符串
} 
 
var用户=新(用户)
 
type用户struct {} 
 
func(用户)SelectAll()([] * User,error){
 var users [  ] *用户
行,错误:= common.db.Query(“从人中选择id,名字,姓氏;”)
如果错误!= nil {
 panic(err)
} 
 
  rows.Next(){
一些代码.. 
} 
返回用户,err 
} 
 
func(用户)SelectOne(id字符串)(*用户,错误){
一些代码.. \  n} 
 
func(用户)插入(名称,姓氏字符串)(*用户,错误){
一些代码。.
} 
 
func(用户)更新(id,名称,姓氏字符串)错误{  
一些代码.. 
} 
 
func(用户)删除(id字符串)错误{
一些代码.. 
} 
  code>  pre> 
  div>

You need to write your db var like this :

package common

import (
    "database/sql"
    "fmt"

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

var Db *sql.DB
var Err error

In Golang Capital letter means exporting it to outside of the package.you can learn more about this here