为了账号安全,请及时绑定邮箱和手机立即绑定

与包共享数据库连接

与包共享数据库连接

Go
鸿蒙传说 2021-11-08 19:30:09
我是 golang 的新手。我正在尝试在我的包中共享 mysql 数据库连接,后者可能在几个包中。为了跳过在我创建的每个包中定义数据库连接,现在我正在尝试获取该包,连接到 db 并在整个包中使用该对象。我正在使用这个 mysql 插件:github.com/go-sql-driver/mysql这是我的代码:main.gopackage mainimport (    "log"    "./packages/db" // this is my custom database package    "database/sql"    _ "github.com/go-sql-driver/mysql")var dbType Database.DatabaseTypevar db *sql.DBfunc 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.gopackage Databaseimport (    "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;")有人能告诉我共享数据库连接的正确方法是什么吗?
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

您的dbType.DbConnect()方法返回DatabaseType带有初始化连接的 a ,但您完全忽略了返回值。


进一步 - 为了简化您的代码 - 看看有New(host string) *DB而不是三个不同的函数(New/DbConnect/GetDb)来做同样的事情。


例如


package datastore


type 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 main


var db *datastore.DB


func 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()方法。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信