Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)
生活随笔
收集整理的這篇文章主要介紹了
Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 安裝數據庫
在 Go 標準庫中是沒有數據庫驅動,只提供了驅動接口,有很多第三方實現了驅動,以下兩種選擇我們都可以進行操作,在本文中選擇 sqlx 。
- 第三方庫 MySQL 驅動庫:
go-sql-driver/mysql - 第三方庫 sqlx 數據庫操作:
jmoiron/sqlx
進入 $GOPATH 目錄使用 go get 下載, 打開命令行執行以下命令:
go get github.com/go-sql-driver/mysql
go get github.com/jmoiron/sqlx
數據庫表結構:
--數據庫表結構
CREATE TABLE IF NOT EXISTS test_user (`id` INT(3) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '',`age` smallint(3) unsigned NOT NULL DEFAULT '0',`gender` tinyint(1) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET = utf8;
2. 代碼實現
讓我們修改下上面內存版的代碼:
package mainimport ("fmt""net/http""strconv"_ "github.com/go-sql-driver/mysql""github.com/jmoiron/sqlx"
)// User 定義用戶屬性結構體
type User struct {Name stringAge intGender int // 1 表示男性, 0 表示女性
}// DB 定義全局變量存放 DB 結構體
var db *sqlx.DB//SetHandler 該函數將新增或者修改用戶信息
func SetHandler(w http.ResponseWriter, r *http.Request) {// 以下三個變量為從瀏覽器獲得的數據name := r.FormValue("name") // r.FormValue 接收來自瀏覽器的信息,返回的是 stringage := r.FormValue("age")gender := r.FormValue("gender")if name == "" {w.Write([]byte("name 不能為空"))return}// 將瀏覽器輸入的字符串轉換為整型ageInt, err := strconv.Atoi(age)if err != nil {w.Write([]byte("age 轉換失敗"))return}genderInt, err := strconv.Atoi(gender)if err != nil {w.Write([]byte("gender 轉換失敗"))return}// 插入用戶信息insertSQL := "INSERT INTO test_user(name, age, gender) values(?, ?, ?)"// 執行 sql 語句_, err = db.Exec(insertSQL, name, ageInt, genderInt)if err != nil {w.Write([]byte("插入數據庫失敗"))return}w.Write([]byte("插入數據庫成功"))
}//ListHandler 用于顯示瀏覽器的輸出
func ListHandler(w http.ResponseWriter, r *http.Request) {var users []User// 從數據庫中查詢用戶信息querySQL := "SELECT * FROM test_user"// 執行查詢語句err := db.Select(&users, querySQL)if err != nil {w.Write([]byte("查詢數據庫失敗"))return}for _, user := range users {fmt.Fprintf(w, "name: %s, age: %d , gender: %d \n", user.Name, user.Age, user.Gender)}
}//DelHandler 刪除用戶信息
func DelHandler(w http.ResponseWriter, r *http.Request) {name := r.FormValue("name")if name == "" {w.Write([]byte("name 不能為空"))return}// 刪除 SQL 語句deleteSQL := "DELETE FROM test_user WHERE name=?"// 執行 SQL 語句_, err := db.Exec(deleteSQL, name)if err != nil {w.Write([]byte("數據庫刪除失敗"))return}w.Write([]byte("數據庫刪除成功"))
}func initDB() error {var err errordsn := "zabbix:zabbix@tcp(192.168.1.148:3306)/zabbix"// 使用 mysql 驅動連接數據庫db, err = sqlx.Connect("mysql", dsn)if err != nil {fmt.Println("數據庫連接失敗:", err)}return nil
}
func main() {// 初始化數據庫連接err := initDB()if err != nil {fmt.Println("init db failed, err:%v\n", err)return}// 分別定義瀏覽器中輸入 set/list/del/ 時對應的函數http.HandleFunc("/set", SetHandler)http.HandleFunc("/list", ListHandler)http.HandleFunc("/del", DelHandler)// 啟動監聽 8080 端口err = http.ListenAndServe(":8080", nil)if err != nil {fmt.Println("http.ListenAndServe:", err)}
}
打開命令行執行以上實例,我們添加兩個用戶試試:
http://127.0.0.1:8000/set?name=張三&age=20&gender=0
http://127.0.0.1:8000/set?name=李四&age=21&gender=1
查看數據庫,插入成功
關于 sqlx 的總結:
- 查詢,
sqlx.DB.Get和sqlx.DB.Select - 更新、插入、刪除,
sqlx.DB.Exec - 事務,
sqlx.DB.Begin()、sqlx.DB.Commit()、sqlx.DB.Rollback()
關于數據庫更多內容,請查看
https://blog.csdn.net/wdy_yx/article/details/78262528
參考:
https://gitbook.cn/books/5ddcab30019a6b4dc4044048/index.html
總結
以上是生活随笔為你收集整理的Go 学习笔记(56)— Go 第三方库 sqlx (操作数据库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Go 学习笔记(55)— Go 标准库
- 下一篇: 2022-2028年中国可降解聚乙烯农用