与包共享数据库连接

我是 golang 的新手。我正在尝试在我的包中共享 mysql 数据库连接,后者可能在几个包中。为了跳过在我创建的每个包中定义数据库连接,现在我正在尝试获取该包,连接到 db 并在整个包中使用该对象。


我正在使用这个 mysql 插件:github.com/go-sql-driver/mysql


这是我的代码:


main.go


package main


import (

    "log"

    "./packages/db" // this is my custom database package

    "database/sql"

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

)


var dbType Database.DatabaseType

var db *sql.DB


func main() {

    log.Printf("-- entering main...")

    dbType := Database.New()

    db = dbType.GetDb()


    dbType.DbConnect()


    delete_test_data()


    dbType.DbClose()

}


func delete_test_data(){

    log.Printf("-- entering delete_test_data...")


    //db.Exec("DELETE FROM test;")

}

包/db/db.go


package Database


import (

    "log"

    "database/sql"

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

)


type DatabaseType struct {

   DatabaseObject *sql.DB

}


func New()(d *DatabaseType) {

    d = new(DatabaseType)

    //db.DatabaseObject = db.DbConnect()

    return d

}



func (d *DatabaseType) DbConnect() *DatabaseType{

    log.Printf("-- entering DbConnect...")

    var err error


    if d.DatabaseObject == nil {

        log.Printf("--------- > Database IS NIL...")

        d.DatabaseObject, err = sql.Open("mysql", "...")

        if err != nil {

            panic(err.Error())

        }


        err = d.DatabaseObject.Ping()

        if err != nil {

            panic(err.Error())

        }

    }


    return d

}


func (d *DatabaseType) DbClose(){

    log.Printf("-- entering DbClose...")

    defer d.DatabaseObject.Close()

}


func (d *DatabaseType) GetDb() *sql.DB{

   return d.DatabaseObject

}

一切正常,没有错误,直到我取消注释这一行:


db.Exec("DELETE FROM test;")

有人能告诉我共享数据库连接的正确方法是什么吗?


鸿蒙传说
浏览 150回答 1
1回答

天涯尽头无女友

您的dbType.DbConnect()方法返回DatabaseType带有初始化连接的 a ,但您完全忽略了返回值。进一步 - 为了简化您的代码 - 看看有New(host string) *DB而不是三个不同的函数(New/DbConnect/GetDb)来做同样的事情。例如package datastoretype DB struct {    // Directly embed this    *sql.DB}func NewDB(host string) (*DB, error) {    db, err := sql.Open(...)    if err != nil {        return nil, err    }    return &DB{db}, nil}package mainvar db *datastore.DBfunc main() {    var err error    db, err = datastore.NewDB(host)    if err != nil {        log.Fatal(err)    }    err := someFunc()}func someFunc() error {    rows, err := db.Exec("DELETE FROM ...")    // Handle the error, parse the result, etc.}这减少了您必须做的杂耍,您仍然可以对您的数据库类型调用 close,因为它嵌入了*sql.DB- 无需实现您自己的Close()方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go