Go語言實現MySQL連線和增刪查改操作
阿新 • • 發佈:2020-08-19
Go語言實現MySQL連線和增刪查改操作
1、mysql資料庫驅動安裝
go語言連線資料庫的驅動是:go-sql-driver,在使用mysql之前要下載驅動
開啟命令列輸入
go get -u github.com/go-sql-driver/mysql
2、建立資料庫表
下文例項中的資料庫表SQL檔案:
CREATE TABLE `stu_info` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `addr` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3、mysql資料庫連線
構建連線, 格式是:”使用者名稱:密碼@tcp(IP:埠)/資料庫?charset=utf8”
具體增刪查改操作看下文例子
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "strings" ) type Student struct { Id int32 Name string Age int32 Addr string } //資料庫配置 const ( userName = "root" password = "xxw2020" ip = "127.0.0.1" port = "3306" dbName = "student" ) //Db資料庫連線池 var DB *sql.DB //注意方法名大寫,就是public func InitDB() { //構建連線:"使用者名稱:密碼@tcp(IP:埠)/資料庫?charset=utf8" path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "") fmt.Println(path) //開啟資料庫,前者是驅動名,所以要匯入: _ "github.com/go-sql-driver/mysql" DB, _ = sql.Open("mysql", path) if DB == nil { fmt.Println("連線失敗!") return } //設定資料庫最大連線數 DB.SetConnMaxLifetime(10) //設定上資料庫最大閒置連線數 DB.SetMaxIdleConns(5) //驗證連線 if err := DB.Ping(); err != nil{ fmt.Println("opon database fail") return } fmt.Println("connnect success") } func InsertStu(user Student) (bool){ //開啟事務 tx, err := DB.Begin() if err != nil{ fmt.Println("tx fail") return false } //準備sql語句 stmt, err := tx.Prepare("INSERT INTO stu_info (`id`,`name`,`age`, `addr`) VALUES (?, ?, ?, ?)") if err != nil{ fmt.Println("Prepare fail") return false } //將引數傳遞到sql語句中並且執行 res, err := stmt.Exec(user.Id, user.Name, user.Age, user.Addr) if err != nil{ fmt.Println("Exec fail") return false } //將事務提交 tx.Commit() //獲得上一個插入自增的id fmt.Println(res.LastInsertId()) return true } //刪除使用者 func DeleteStu(userId int32) (bool) { //開啟事務 tx, err := DB.Begin() if err != nil{ fmt.Println("tx fail") } //準備sql語句 stmt, err := tx.Prepare("DELETE FROM stu_info WHERE id = ?") if err != nil{ fmt.Println("Prepare fail") return false } //設定引數以及執行sql語句 res, err := stmt.Exec(userId) if err != nil{ fmt.Println("Exec fail") return false } //提交事務 tx.Commit() //獲得上一個insert的id fmt.Println(res.LastInsertId()) return true } //更新資料 func UpdateStu(stu Student) (bool) { //開啟事務 tx, err := DB.Begin() if err != nil{ fmt.Println("tx fail") } //準備sql語句 stmt, err := tx.Prepare("UPDATE stu_info SET name = ?, age = ? WHERE id = ?") if err != nil{ fmt.Println("Prepare fail") return false } //設定引數以及執行sql語句 res, err := stmt.Exec(stu.Name, stu.Age, stu.Id) if err != nil{ fmt.Println("Exec fail") return false } //提交事務 tx.Commit() fmt.Println(res.LastInsertId()) return true } //查詢一行資料 func SelectStuById(id int) (Student) { var stu Student err := DB.QueryRow("SELECT * FROM stu_info WHERE id = ?", id).Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr) if err != nil{ fmt.Println("查詢出錯了") } return stu } //查詢多行資料 func SelectAllStu() ([]Student) { //執行查詢語句 rows, err := DB.Query("SELECT * from stu_info") if err != nil{ fmt.Println("查詢出錯了") } var stus []Student //迴圈讀取結果 for rows.Next(){ var stu Student //將每一行的結果都賦值到一個user物件中 err := rows.Scan(&stu.Id, &stu.Name, &stu.Age, &stu.Addr) if err != nil { fmt.Println("rows fail") } //將user追加到users的這個陣列中 stus = append(stus, stu) } return stus } func main() { InitDB() stu := Student{ Id: 3, Name: "xxw", Age: 20, Addr: "北京", } fmt.Println(stu) //InsertStu(stu) //註釋的操作自己選擇進行。 //DeleteStu(4) //UpdateStu(stu) //stutemp := SelectStuById(1) //fmt.Println(stutemp) stus := SelectAllStu() fmt.Println(stus) }
多動手最好自己手寫一遍。