Golang連線使用MySql5.7資料庫完整步驟
阿新 • • 發佈:2018-12-09
建立資料庫、使用者以及修改密碼
在終端中輸入命令,啟動資料庫:
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