1. 程式人生 > 其它 >Go語言基礎——MySQL連線與使用

Go語言基礎——MySQL連線與使用

技術標籤:Go基礎Gomysql資料庫

Go語言基礎——MySQL連線與使用

一,MySQL的連線

  1. mysql的連線需要使用到的第三方mysql庫:
  • github.com/go-sql-driver/mysql (mysql驅動)
  • github.com/jmoiron/sqlx (基於mysql驅動的封裝)
    獲取方式:在IDE的命令列中輸入:
  go get github.com/go-sql-driver/mysql 
  go get github.com/jmoiron/sqlx
  1. mysql的連線語法:
 database, err := sqlx.Open("mysql", "root:[email protected](127.0.0.1:3306)/test")
    //database, err := sqlx.Open("資料庫型別", "使用者名稱:密碼@tcp(地址:埠)/資料庫名")

二,Insert操作:

(1)連線資料庫
(2)插入
(3)關閉資料庫連線

  • 程式碼示例:(本段程式碼有錯誤,下面會進行解析)
import (
	"fmt"
	"github.com/jmoiron/sqlx"
) var Db *sqlx.DB //資料庫連線驅動 func init(){ database,err :=sqlx.Open("mysql","root:[email protected](127.0.0.1:3306)/user_info") if err!=nil{ fmt.Println("open mysql failed:",err) return } Db = database defer Db.Close() } func main() { r,err :=Db.Exec("insert into student(studentName,studentMajor,studentDept,studentSex)values (?,?,?,?)"
,"小明","軟體工程","電腦科學學院",1) if err!=nil{ fmt.Println("exec failed",err) return } id,err :=r.LastInsertId() if err!=nil{ fmt.Println("exec failed",err) return } fmt.Println("insert success",id) }
  • 錯誤1open mysql failed: sql: unknown driver “mysql” (forgotten import?)
open  mysql  failed: sql: unknown driver "mysql" (forgotten import?)
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0xc5c888]

錯誤的內容:提示沒有匯入mysql的驅動。
錯誤原因:如果直接依賴IDE本身去進行導包的過程,它不會給你匯入mysql的驅動包

import (
	"fmt"
	"github.com/jmoiron/sqlx"
	//缺少mysql驅動包,sqlx只是Go對於mysql驅動的封裝,幫助使用mysql的
)

因此需要改為:

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

這裡的mysql驅動包前面加一個:_表示的是:這個包裡面需要執行他的init函式。
為什麼加這個呢?
是因為Go的IDE檢查如果你程式碼中沒有用到的包,就會報錯。因此這裡使用這樣的方式,避免了IDE的檢查報錯。(這IDE金笨)

  • 錯誤2:exec failed sql: database is closed

錯誤的內容:顯示資料庫已經關閉了
錯誤原因:使用defer關閉資料庫時出現了錯誤。defer Db.Close()
會在init函式結束的時候執行。
所以這種型別的資源不需要defer關閉
在這裡插入圖片描述
關於defer的坑文章連結(點選)
解決方法:去掉init中的defer將其放在main中,資料庫沒有使用的地方。

三,Select操作

(1)連結資料庫
(2)查詢
(3)關閉

  • 例項程式碼:
import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
)

type Student struct {
	StudentId   int    `db:"studentId"`
	StudentName string `db:"studentName"`
	StudentMajor string `db:"studentMajor"`
	StudentDept   string `db:"studentDept"`
	StudentSex  int `db:"studentSex"`
}
var  db  *sqlx.DB
func init() {
	database, err := sqlx.Open("mysql", "root:[email protected](127.0.0.1:3306)/user_info")
	if err != nil {
		fmt.Println("open  mysql  failed:", err)
		return
	}
	db =database

}
func main() {
	var studentInfo  []Student
	err :=db.Select(&studentInfo,"select  studentId,studentName,studentMajor,studentDept,studentSex  from student  where studentId=?",18)
	if  err!=nil{
		fmt.Println("exec  failed:",err)
		return
	}
	fmt.Println("studentInfo:",studentInfo)
	db.Close()
}

遇到的問題:
最開始的struct裡面的變數是首字母小寫的,於是出現了這樣的錯誤。
原本的struct:

type Student struct {
	studentId   int    `db:"studentId"`
	studentName string `db:"studentName"`
	studentMajor string `db:"studentMajor"`
	studentDept   string `db:"studentDept"`
	studentSex  int `db:"studentSex"`
}

出現的錯誤:exec failed: non-struct dest type struct with >1 columns (5)
原因:構體(struct)裡面的成員變數首字母是區分大小寫的,若首字母大寫則該成員為公有成員(對外可見),否則是私有成員(對外不可見)。
如何修改:外部需要訪問,改為首字母大寫。

四,update操作

(1)連結資料庫
(2)更新
(3)關閉

func main() {
	res,err:=db.Exec("update student  set studentName=?  where  studentId=?","小剛","18")
	if err!=nil{
		fmt.Println("exec failed",err)
		return
	}
	row,err :=res.RowsAffected()
	if  err!=nil{
		fmt.Println("row  failed",err)
	}
	fmt.Println("update:",row)
	defer db.Close()
}