Go語言操作MySQL實現增刪改查

看過了謝孟軍的Go語言Web變成的書籍之後,發現書中只講了沒有已駝峯命名的用法,所以在使用的時候踩了坑,解決辦法就是在struct字段名後面顯示的生命對應的數據庫表字段名。詳細測試過程如下。

package main

import (
	"database/sql"
	"fmt"
	"github.com/astaxie/beedb"
	_ "github.com/Go-SQL-Driver/MYSQL"
	"log"
	"time"
	"video/util"
)

/**
	beedb針對駝峯命名會自動幫你轉化成下劃線字段
	例如你定義了Struct名字爲UserInfo,
	那麼轉化成 底層實現的時候是user_info,
	字段命名也遵循該規則。
 */
type UserInfo struct {
	////如果表的主鍵不是id,那麼需要加上pk註釋,顯式的說這個字段是主鍵
	Uid int `PK`			//`beedb:"PK" sql:"UID" tname:"user_info"`
	UserName    string  		`sql:"user_name"`
	DepartName  string  		`sql:"depart_name"`
	Created     string 			`sql:"created"`
}

func main() {

	db, err := sql.Open("mysql","root:root@/test?charset=utf8")
	util.CheckError(err)

	//beedb的New函數實際上應該有兩個參數,
	// 第一個參數標準接口的db,
	// 第二個參數是使用的數據庫引擎,如果使用的 數據庫引擎是MySQL/Sqlite,那麼第二個參數都可以省略
	orm := beedb.New(db)
	//orm := beedb.New(db,"mssql")   // SQLServer
	//orm := beedb.New(db,"pg")   	 // PostgreSQL
	//實現調試
	beedb.OnDebug = true

	//新增數據
	var saveUser UserInfo
	saveUser.UserName = "安琪拉"
	saveUser.DepartName = "研發部"
	saveUser.Created = time.Now().Format("2006-01-02 03:04:05")
	err = orm.Save(&saveUser)
	if err != nil {
		log.Printf("Save Failure : %v", err)
	}

	//map數據插入
	addUser:= make(map[string] interface{})
	addUser["user_name"] = "胡安琪"
	addUser["depart_name"] = "研發部"
	addUser["created"] = "1993-11-23"
	_, err = orm.SetTable("user_info").Insert(addUser)
	if err != nil {
		log.Printf("Insert Failure : %v", err)
	}

	//批量插入
	addOne := make(map[string]interface{})
	addTwo := make(map[string]interface{})
	addOne["user_name"] = "仙姑"
	addOne["depart_name"] = "雲平臺開發"
	addOne["created"] = "2012-12-02"
	addTwo["user_name"] = "韓湘子"
	addTwo["depart_name"] = "雲平臺開發"
	addTwo["created"] = "2012-12-02"

	addSlice := make([] map[string] interface{},0)
	addSlice = append(addSlice, addOne, addTwo)

	_, err = orm.SetTable("user_info").InsertBatch(addSlice)
	if err != nil {
		log.Printf("InsertBatch Failure : %v", err)
	}

	//更新數據也支持直接使用map操作
	t := make(map[string]interface{})
	t["user_name"] = "丁凌"
	_, err = orm.SetTable("user_info").SetPK("uid").Where(2).Update(t)
	if err != nil {
		log.Printf("Update Failure : %v", err)
	}
	//數據查詢
	var user UserInfo
	err = orm.Where("uid=?",2).Find(&user)
	if err != nil {
		log.Printf("Find By Primary Key Failure : %v", err)
	}

	var user2 UserInfo
	//可以省略主鍵,主鍵必須是 字段  `id`
	//所以這一句一定會執行報錯,是一個坑
	err = orm.Where(2).Find(&user2)
	if err != nil {
		log.Printf("Ignore PrimaryKey Find Failure : %v", err)
	}

	var user3 UserInfo
	err = orm.Where("user_name = ?","丁凌").Find(&user3)
	if err != nil {
		log.Printf("Find By UserName Failure : %v", err)
	}

	var user4 UserInfo
	err = orm.Where("user_name = ? and created >= ?","丁凌", "1993-11-23").Find(&user4)
	if err != nil {
		log.Printf("Find By UserName And created Failure : %v", err)
	}

	var allUser []UserInfo

	err = orm.Where("uid > ?",3).FindAll(&allUser)
	if err != nil {
		log.Printf("Find By Uid Failure : %v", err)
	}

	err = orm.Where("uid > ?",1).Limit(0,2).FindAll(&allUser)
	if err != nil {
		log.Printf("Find By Uid And Limit 0, 2 Failure : %v", err)
	}

	err = orm.Where("uid > ?",1).Limit(2).FindAll(&allUser)
	if err != nil {
		log.Printf("Find By Uid And Limit Start 2 Failure : %v", err)
	}

	err = orm.OrderBy("uid desc,user_name desc").FindAll(&allUser)
	if err != nil {
		log.Printf("Find Order By uid desc,user_name desc Failure : %v", err)
	}
	//util.CheckError(err)

	//FindMap()函數返回的是[]map[string][]byte類型,所以你需要自己作類型轉換。
	a, err := orm.SetTable("user_info").SetPK("uid").Where(2).Select("user_name,depart_name").FindMap()
	if err != nil {
		log.Printf("Find user_name,depart_name By uid Failure : %v", err)
	}
	for key, value := range a {
		fmt.Println(key)
		fmt.Println(value)
	}


	//查詢出來,再刪除
	//orm.Delete(&saveUser)
	//全部刪除 先查出來
	//orm.DeleteAll(&allUser)
	//根據SQL刪除
	//orm.SetTable("user_info").Where("uid>?", 3).DeleteRow()

}

推薦一個公衆號

號主爲一線大廠架構師,CSDN博客專家,博客訪問量突破一千萬。主要分享Java、golang架構,源碼,分佈式,高併發等技術,用大廠程序員的視角來探討技術進階、面試指南、職業規劃等。15W技術人的選擇!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章