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

如何在 Go 中将数据库连接初始化作为一个包分开?

如何在 Go 中将数据库连接初始化作为一个包分开?

Go
万千封印 2023-03-21 15:44:12
我有两个包,main和db. 但是,我收到"DB declared and not used"错误。数据库package dbimport (  "database/sql")var DB *sql.DBfunc Connect() {  DB, err := sql.Open("mysql", "root:xxxx@/xxxx")  if err != nil {    panic(err.Error())  }}func Close() {  DB.Close()}主程序package mainimport (    "database/sql"    // "fmt"    _ "github.com/go-sql-driver/mysql"    "html/template"    "net/http"  "github.com/****/****/config"  "github.com/****/****/db")var tpl *template.Templatefunc init() {    tpl = template.Must(template.ParseGlob("templates/*.gohtml"))}func main() {    Connect()    defer Close()    loadRoutes()    http.ListenAndServe(":8080", nil)}
查看完整描述

2 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

Golang 对变量声明的要求很严格,在Golang FAQs中也有提到:

未使用的变量的存在可能表示存在错误,而未使用的导入只会减慢编译速度,随着时间的推移,随着程序积累代码和程序员,这种影响可能会变得很明显。由于这些原因,Go 拒绝使用未使用的变量或导入来编译程序,以短期便利换取长期构建速度和程序清晰度。


不过,解决这种情况很容易。使用空白标识符让未使用的东西在您开发时保留下来。


_, err := sql.Open("mysql", "root:Berlin2018@/jplatform")

但是由于您想要通过创建连接来创建数据库实例。我建议通过从函数返回来使用它,或者您可以通过将 ping 发送到数据库服务器来检查连接是否正常工作:


var DB *sql.DB


func Connect() {

    DB, err := sql.Open("mysql", "root:Berlin2018@/jplatform")

    if err = DB.Ping(); err != nil {

        log.Panic(err)

    }

}

或者您可以创建一个结构,您可以在任何地方使用它,包括为每个需要 db 连接来查询数据库的函数使用方法接收器


type Env struct {

    db *sql.DB

}


func Connect() {

    db, err := sql.Open("mysql", "root:Berlin2018@/jplatform")

    _ = &Env{db: db}

}


func(env *Env) getDataFromDatabase(){}


查看完整回答
反对 回复 2023-03-21
?
PIPIONE

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

您没有DB在以下位置使用变量db.go:


package db


import (

  "database/sql"

)


var DB *sql.DB


func Connect() {

  con, err := sql.Open("mysql", "root:Berlin2018@/jplatform")

  if err != nil {

    panic(err.Error())

  }

  DB = con

}


func Close() {

  DB.Close()

}


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

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