原生SQL查詢

尹成發表於2018-11-14
type SqlController struct {
	beego.Controller
}

#Prepare
sql語句在傳送到伺服器時會做語法檢查和編譯,然而我們多次執行同一功能的sql語句,只是每次傳遞的引數不一致,所以我們可以通過Prepare進行預處理,這樣伺服器只需要,做一次語法檢查和編譯,極大的提高了執行sql語句的效率

func (this *SqlController) GetPrepare() {
	//1.建立orm
	orm := orm.NewOrm()
	p, err := orm.Raw("update user set name = ? where name = ?").Prepare()
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
		return
	}
	res, err := p.Exec("吳俏祥", "123")
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	n, err := res.RowsAffected()
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	fmt.Println("n = ", n)

	res, err = p.Exec("尹成大魔王", "mike")
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	n, err = res.RowsAffected()
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	fmt.Println("n = ", n)

	res, err = p.Exec("兄弟連", "asde")
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	n, err = res.RowsAffected()
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
	}
	fmt.Println("n = ", n)
	this.Ctx.WriteString("成功!")

}

#將將指定的欄位解析到map

func (this *SqlController) GetRawsToMap() {
	//1.建立map
	res := make(orm.Params)
	//2.建立orm
	orm := orm.NewOrm()
	//3.通過sql語句查詢
	//將user表中name作為鍵,nickname作為值存入map中,其中鍵是string型別,
	// 如果型別不匹配beego會自動轉換為string型別
	/*n, err := orm.Raw("select nickname, name from user").
		RowsToMap(&res, "name", "nickname")*/
	n, err := orm.Raw("select * from user").RowsToMap(&res, "age", "name")
	//4.處理錯誤
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
		return
	}
	//5.列印結果
	fmt.Println("n = ", n)
	for key, value := range res {
		fmt.Println(key, " = ", value)
	}
	//6.給客戶端返回資料
	this.Ctx.WriteString("查詢成功!")
}

#QueryRows

func (this *SqlController) GetQueryRows(){
	//1.建立user切片
	var users []*models.User
	//2.建立orm
	orm := orm.NewOrm()
	//3.通過sql語句查詢
	n, err := orm.Raw("select * from user where name = ?", "mike").QueryRows(&users)
	//4.處理錯誤
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
		return
	}
	//5.列印結果
	fmt.Println("n = ", n)
	for _, user := range users {
		fmt.Println("user = ", user)
	}
	//6.給客戶端返回資料
	this.Ctx.WriteString("查詢成功!")
}

#QueryRow

func (this *SqlController) GetQueryRow() {
	//1.建立user物件
	//user := models.User{}
	var user models.User
	//2.建立orm
	orm := orm.NewOrm()
	//3.通過sql語句查詢
	err := orm.Raw("select * from user where id = ?", 3).QueryRow(&user)
	//4.處理錯誤
	if err != nil {
		fmt.Println("err = ", err)
		this.Ctx.WriteString("查詢出錯!")
		return
	}
	//5.列印結果
	fmt.Println("user = ", user)
	this.Ctx.WriteString("查詢成功!")
}

#Exec

func (this *SqlController) GetRawAndExec() {
	//建立orm
	orm := orm.NewOrm()
	//raw函式中的引數是sql語句,形式引數通過?佔位,後面提供的實際引數和?的順序一一對應
	//Exec()函式的功能是執行sql語句
	res, err := orm.Raw("update user set name = ? where id = ?", "admin", 7).Exec()
	if err != nil {
		this.Ctx.WriteString("查詢失敗!")
		return
	}
	n, err := res.RowsAffected()//查詢受影響的行數
	if err != nil {
		this.Ctx.WriteString("查詢失敗!")
		return
	}
	this.Ctx.WriteString("mysql row affected nums = " + strconv.Itoa(int(n)))
}

學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928

清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
在這裡插入圖片描述