1. 程式人生 > >Golang連線使用MySql5.7資料庫完整步驟

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 '[email protected]' 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:[email protected](localhost:3306)/test_db?charset=utf8")
    db, err := sql.Open("mysql", "guest:[email protected]/test_db?charset=utf8")
    checkErr(err)

    // 插入資料
    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, 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)

    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    // 查詢資料
    rows, err := db.Query("SELECT * FROM userinfo")

    // 結果都儲存在row指引的空間中,下面是一般讀取的方式
    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