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

版权声明:所有的博客都是作为个人笔记的。。。。。。 https://blog.csdn.net/qq_35976351/article/details/82623637

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/82623637