Golang连接使用MySql5.7数据库完整步骤

创建数据库、用户以及修改密码

在终端中输入命令,启动数据库:

service mysql start

以下是在MySql中执行的操作。
为防止修改系统的数据库,我们需要新建一个新的数据库:

CREATE DATABASE test_db;

切换到新建的数据库:

use test_db;

在该数据库中新建一个表单,其中uid是自动增长的主键:

CREATE TABLE "userinfo" (
		'uid' INT(10) NOT NULL AUTO_INCREMENT,
		'username' VARCHAR(64) NULL DEFAULT NULL,
		'departname' VARCHAR(64) NULL DEFAULT NULL,
		'created' DATE NULL DEFAULT NULL,
		PRIMARY KEY('uid')
)

新建一个用户,赋予该用户在test_db上操作的权利,尽量不要使用root进行操作,以免误删除有关的数据,新建用户一般使用root的身份,先切换数据库:

use mysql;

test_db新建用户:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP
	ON test_db.user TO 'guest@localhost' IDENTIFIED BY '123';

其中用户名是guest,所有权属于localhost,123表示密码。

如果想要修改密码:

use mysql;

在mysql5.7以及以后,需要修改authentication_string属性:

update mysql.user set authentication_string=password("123") where user="guest" and host="localhost";

然后刷新权限:

flush privileges;

在Golang中调用

Golang中仅仅定义了接口,没有具体实现mysql的驱动,因此我们使用github上最流行的一个库:

go get -u github.com/go-sql-driver/mysql 

这样,就会把该包添加到你之前定义GOPATH中。

然后在代码中需要单独引入包:

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

_表示可以使用包中所有的成员,而不用添加包名。

使用Open()函数建立链接,先给出Open函数的参数类型:

user@unix(/path/to/socket)/dbname?charset=utf8  // unix系统的,我一般不用
user:password@tcp(localhost:5555)/dbname?charset=utf8 // 涉及到远程链接调用的
user:password@/dbname  // 本地使用的
user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname // 涉及到IPV6的

如果需要检测mysql的监听地址,则需要在shell中输入:

 cat /etc/services | grep mysql

之后会看到输出(以自己的计算机的为准):

mysql		3306/tcp
mysql		3306/udp
mysql-proxy	6446/tcp			# MySQL Proxy
mysql-proxy	6446/udp

下面给出代码:

package main

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

// 错误检测函数
func checkErr(err error) {
	if err != nil {
		panic(err)
	}
}

func use_sql() {
	// 建立数据库链接,下面两种方式都可以
	//	db, err := sql.Open("mysql", "guest:123@tcp(localhost:3306)/test_db?charset=utf8")
	db, err := sql.Open("mysql", "guest:123@/test_db?charset=utf8")
	checkErr(err)

	// 插入数据,返回准备状态stmt
	stmt, err := db.Prepare("INSERT userinfo SET username=?,departname=?,created=?")
	checkErr(err)
	// 执行状态,注意不能出现中文,暂时还未解决,里面顺序地包含对应的参数
	res, err := stmt.Exec("guest", "study part", "2012-12-09")
	checkErr(err)
	// 数返回由数据库执行插入操作得到的自增 ID 号
	id, err := res.LastInsertId()
	checkErr(err)

	fmt.Println(id)
	// 返回更新数据的准备状态
	stmt, err = db.Prepare("UPDATE userinfo set username=? where uid=?")
	checkErr(err)
	// 执行状态,里面顺序的包含执行状态
	res, err = stmt.Exec("guest_update", id)
	checkErr(err)
	// 返回 query 操作影响的数据条目数。
	affect, err := res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)

	// 查询数据,返回一个迭代器
	rows, err := db.Query("SELECT * FROM userinfo")
	// rows相当于执行迭代器,到末尾后自动关闭
	for rows.Next() {
		var uid int
		var username string
		var department string
		var created string
		// 把数据读取出到相应的变量中
		err = rows.Scan(&uid, &username, &department, &created)
		checkErr(err)

		fmt.Println(uid)
		fmt.Println(username)
		fmt.Println(department)
		fmt.Println(created)
	}

	// 删除数据,返回执行状态
	stmt, err = db.Prepare("DELETE FROM userinfo WHERE uid=?")
	checkErr(err)
	// 传递参数
	res, err = stmt.Exec(id)
	checkErr(err)
	// 返回执行删除操作后影响的行数
	affect, err = res.RowsAffected()
	checkErr(err)

	fmt.Println(affect)
	db.Close() // 关闭数据库
}

func main() {
	use_sql()
}

输出结果:

2
1
1
guest_update
study part
2012-12-09
2
guest_update
study part
2012-12-09
1

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值