Go語言基礎——MySQL連線與使用
阿新 • • 發佈:2021-01-29
Go語言基礎——MySQL連線與使用
一,MySQL的連線
- 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
- 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)
}
錯誤1
:open 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()
}