Go连接MySQL的方式问题

happy_life123 · · 8832 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在系统安装好mysql,go以及mysql-go的驱动之后,需要做的就是连接mysql,给个简短的连接数据库代码如下:

package main

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

func main() {
	db, err := sql.Open("mysql", "user:password@/test")//对应数据库的用户名和密码
	defer db.Close()
	if err != nil {
		panic(err)
	} else {
		fmt.Println("success")
	}
	rows, err := db.Query("SELECT number FROM squarenum")
	if err != nil {
		panic(err)
		return
	}
	for rows.Next() {
		var name int
		err = rows.Scan(&name)
		if err != nil {
			panic(err)
		}
		fmt.Println(name)
	}
}

以上代码是默认情况下的连接方式,但在某种状况下,上述方式连接不上的时候,而且提示:

<span style="font-size:14px;">panic: runtime error: invalid memory address or nil pointer dereference</span>
经过查阅多方资料,找到的答案是指定具体连接mysql的方式有三种不同代码:

db, err := sql.Open("mysql", "user:password@unix(/tmp/mysql.sock)/test")


db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/test")   //指定IP和端口

db, err := sql.Open("mysql", "user:password@/test")  //默认方式


<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">那么,这两种方式的区别在哪呢?首先可以看下面两幅图片:</span>



每一次外部以某种身份连接到mysql的时候,mysql会新增一个Connection id,Connection显示的是该程序连接到mysql的连接方式。

图片中给出了两个不同用户的状态,注意两个用户的连接方式,一个是via TCP/IP,另一个是via UNIX socket。还发现一个微小的问题,就是端口号指定问题,端口号的范围是0-65535,因此对于大于65535的端口号会出现系统识别不了的问题。这只是对像我一样的初学者的提醒。


查看用户发现一个问题就是,系统为什么会有那么多的root用户,其实对于mysql而言,host+username才是一个基本单位,所以可以认为root在不同host名下是不同的用户

1、::1应该是表示本地的v6地址
2、没有用户名的话,应该是匿名用户了
3、对于mysql来讲,127.0.0.1和localhost应该不一样的;

在采用默认连接方式,即③的时候,panic: Error 1045: Access denied for user 'root'@'localhost' (using password: YES)

证明系统默认选择的root是没有密码的,如果需要用root@localhost需要额外指定,如:db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/test") 


综上所述,问题大致源于用户管理问题,所以理清这些问题,自然就可以解决出现的问题。




有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:happy_life123

查看原文:Go连接MySQL的方式问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8832 次点击  
加入收藏 微博
4 回复  |  直到 2019-07-01 19:15:56
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传