创建数据库、用户以及修改密码
在终端中输入命令,启动数据库:
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