首页 > 解决方案 > 已建立连接时插入数据库的问题

问题描述

我正在尝试使用此代码将某些内容插入 MySQL 数据库。当我运行调试器时,我看到它停在这一行:

stmt, err := users_db.Client.Prepare(queryInsertUser)

我的调试器将我带到这一行,db 的值为 nil。请注意,这些行不是我的,应该是内部 Go 模块等。我的数据库连接也已经建立,正如我在控制台中看到的那样。

// conn returns a newly-opened or cached *driverConn.
func (db *DB) conn(ctx context.Context, strategy connReuseStrategy) (*driverConn, error) {
    db.mu.Lock()
    if db.closed {
        db.mu.Unlock()
        return nil, errDBClosed
    }

func (user *User) Save() *errors.RestError {
    stmt, err := users_db.Client.Prepare(queryInsertUser)
    if err != nil {
        return errors.NewInternalServerError(err.Error())
    }
    defer stmt.Close()
    insertResult, err := stmt.Exec(user.FirstName, user.LastName, user.Email, user.DateCreated)
    // not so important part removed 
    return nil
}

和我的 users_db 包中的代码

package users_db

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "log"
)

var (
    Client   *sql.DB
    username = "bla bla"
    password = "bla bla"
    host     = "bla bla"
    schema   = "bla bla"
)

func init() {
    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",
        username, password, host, schema,
    )
    var err error
    Client, err := sql.Open("mysql", dataSourceName)
    if err != nil {
        panic(err)
    }
    if err = Client.Ping(); err != nil {
        panic(err)
    }

    log.Println("database successfully configured")
}

此错误的原因可能是什么?如何解决?

标签: mysqlgo

解决方案


正如@mkopriva 评论的那样,您在init 中再次声明了Client。您可以通过以下方式解决它:

c, err := sql.Open("mysql", dataSourceName) 
Client = c

推荐阅读