猿问

使用 golang 获取 mysql 连接时出错

我是 golang 和 MySQL 的新手,我正在使用开发框创建一个简单的网页,使用 golang(来自 2 个文件的代码在下面)来获取输入,将输入存储到数据库中并在网页上显示输入。目前在本地使用 MySQL 作为我的数据库,我的用户名是 root,密码是 abc,我的数据库也被命名为 abc。


在顶部我已经导入:


  import (

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


      "database/sql"

  )

当我提供我的网页时,我调用我的 connectDB 函数:


 func init(){

    INDEX_HTML , _ = ioutil.ReadFile("./templates/index.html")

    connectDb()

 }


 func connectDb(){

    //socket : var/run/mysqld/mysqld.sock

 /* connection string examples : 

  db, err := sql.Open("mysql", "user:password@/dbname")

  user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true  


  TCP using default port (3306) on localhost: 

    user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped


  Use the default protocol (tcp) and host (localhost:3306):

    user:password@/dbname


  No Database preselected:

    user:password@/

*/


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


    log.Println("DB: ", db)


    checkErr(err)


    // Open doesn't open a connection. Validate DSN data:

    checkErr(err)

 }

我的理解和根据https://github.com/go-sql-driver/mysql SQL.open 返回一个 * sql.DB,并且当程序遇到上面的以下代码时:


/* At the top of my code i have var db = *sql.DB */

log.Println("DB: ", db)

我在命令提示符中得到以下内容,上面的代码注释中记录了所有类型的示例连接字符串:


DB: &{0x99c410 root:abc@/abc 0 {0 0} [] [] 0 0xc820072180 false map[] map[] 0 0 0 < nil >}


我的 MySQL 数据库使用给定的用户名和密码通过命令行在本地运行良好,我可以通过手动插入以下查询获得一些项目。


mysql>

mysql> select * from ListItems

     -> ;

+-------+

| items |

+-------+

| item1 |

| item2 |

+-------+

我试图了解消息是什么以及如何连接到 mysql 数据库以运行查询并插入数据库。


也许我的连接字符串有问题?尝试插入数据库时的错误示例:


016/06/20 02:22:36 http: panic serving 10.1.0.5:41861: 

runtime error: invalid    

memory address or nil pointer dereference

goroutine 7 [running]:


翻阅古今
浏览 214回答 1
1回答

跃然一笑

db问题是您声明的全局变量var db *sql.DB从未被赋值。所以它保持它的默认值,即nil. 并且试图取消引用一个 nil 指针会给你错误。您可能认为在init函数中为该变量分配了新创建的DB实例。但是:=会创建一个新的局部变量来保存新DB实例。全局db变量保持不变。见例子。所以改为这样做,var err errordb, err = sql.Open("mysql", "root:abc@/abc")同样根据我使用全局变量的经验,当您可以避免它导致难以调试的错误时。(就像这个。)我认为你可以通过connectDb返回一个DB实例来避免它。
随时随地看视频慕课网APP

相关分类

Go
我要回答