欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang中xorm的基本使用說(shuō)明

 更新時(shí)間:2020年12月19日 09:31:29   作者:yí無(wú)所冇  
這篇文章主要介紹了golang中xorm的基本使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)單的用法

package main 
import (
 _ "github.com/go-sql-driver/mysql"
 "github.com/go-xorm/xorm"
 "log"
)
 
//定義結(jié)構(gòu)體(xorm支持雙向映射)
type User struct {
 User_id int64 `xorm:"pk autoincr"` //指定主鍵并自增
 Name string `xorm:"unique"` //唯一的
 Balance float64
 Time int64 `xorm:"updated"` //修改后自動(dòng)更新時(shí)間
 Creat_time int64 `xorm:"created"` //創(chuàng)建時(shí)間
 //Version int `xorm:"version"` //樂(lè)觀鎖
}
 
//定義orm引擎
var x *xorm.Engine 
//創(chuàng)建orm引擎
func init() {
 var err error
 x, err = xorm.NewEngine("mysql", "root:root@tcp(127.0.0.1:3306)/xorm?charset=utf8")
 if err != nil {
 log.Fatal("數(shù)據(jù)庫(kù)連接失敗:", err)
 }
 if err := x.Sync(new(User)); err != nil {
 log.Fatal("數(shù)據(jù)表同步失敗:", err)
 }
}
 
//增
func Insert(name string, balance float64) (int64, bool) {
 user := new(User)
 user.Name = name
 user.Balance = balance
 affected, err := x.Insert(user)
 if err != nil {
 return affected, false
 }
 return affected, true
}
 
//刪
func Del(id int64) {
 user := new(User)
 x.Id(id).Delete(user)
}
 
//改
func update(id int64, user *User) bool {
 affected, err := x.ID(id).Update(user)
 if err != nil {
 log.Fatal("錯(cuò)誤:", err)
 }
 if affected == 0 {
 return false
 }
 return true
}
 
//查
func getinfo(id int64) *User {
 user := &User{User_id: id}
 is, _ := x.Get(user)
 if !is {
 log.Fatal("搜索結(jié)果不存在!")
 }
 return user
}
 

在gin中的用法

package main 
import (
 "github.com/gin-gonic/gin"
 "./models"
 "strconv"
)
 
//添加操作
func insert(c *gin.Context) {
 name := c.Query("name")
 if name == "" {
 c.JSON(200, gin.H{"msg": "name不得為空!"})
 return
 }
 
 money := c.Query("money")
 if money == "" {
 c.JSON(200, gin.H{"msg": "money不得為空!"})
 return
 }
 
 Balance, _ := strconv.ParseFloat(money, 64)
 //添加
 user := models.User{}
 user.Name = name
 user.Balance = Balance
 rel, err := models.X.Insert(user) 
 if rel == 0 || err != nil {
 c.JSON(200, gin.H{"msg": "添加錯(cuò)誤", "err": err, "rel": rel})
 } else {
 c.JSON(200, gin.H{"msg": "添加成功"})
 }
}
 
//查詢單個(gè)操作
func get(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id不得為空!"})
 return
 }
 //string轉(zhuǎn)int64
 ids, _ := strconv.ParseInt(id, 10, 64)
 //查詢1
 //user := &User{User_id: ids}
 //rel, err := models.X.Get(user)
 //查詢2
 user := &models.User{}
 rel, err := models.X.Where("user_id = ?", ids).Get(user)
 
 if !rel || err != nil {
 c.JSON(200, gin.H{"msg": "查詢錯(cuò)誤"})
 } else {
 c.JSON(200, gin.H{"user": user})
 }
}
 
//查詢多條操作
func find(c *gin.Context) {
 users := make(map[int64]models.User)
 err := models.X.Find(&users)
 if err != nil {
 c.JSON(200, gin.H{"msg": err})
 }
 c.JSON(200, gin.H{"msg": users})
}
 
//修改操作
func updates(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id1不得為空!", "id": id})
 return
 }
 ids, _ := strconv.ParseInt(id, 10, 64) 
 name := c.Query("name")
 if name == "" {
 c.JSON(200, gin.H{"msg": "name不得為空!"})
 return
 }
 
 balance := c.Query("balance")
 if balance == "" {
 c.JSON(200, gin.H{"msg": "balance不得為空!"})
 return
 }
 money, _ := strconv.ParseFloat(balance, 64)
 //修改
 user := models.User{}
 user.Name = name
 user.Balance = money
 rel, err := models.X.Id(ids).Update(user)
 
 if rel == 0 || err != nil {
 c.JSON(200, gin.H{"msg": "修改錯(cuò)誤!", "rel": rel, "err": err, "user": user})
 } else {
 c.JSON(200, gin.H{"mag": "修改成功"})
 }
}
 
//刪除操作
func delte(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id1不得為空!", "id": id})
 return
 }
 //string轉(zhuǎn)化int64
 ids, _ := strconv.ParseInt(id, 10, 64)
 //刪除
 user := models.User{}
 rel, err := models.X.Id(ids).Delete(user)
 
 if rel == 0 || err != nil {
 c.JSON(200, gin.H{"msg": "刪除錯(cuò)誤!", "rel": rel, "err": err, "user": user})
 } else {
 c.JSON(200, gin.H{"mag": "刪除成功"})
 }
}
 
//事務(wù)的提交以及回滾
func gun(c *gin.Context) {
 //創(chuàng)建session
 session := models.X.NewSession()
 defer session.Close()
 //創(chuàng)建事務(wù)
 err := session.Begin()
 if err != nil {
 c.JSON(200, gin.H{"err": err})
 return
 }
 //操作事務(wù),失敗并回滾(模擬購(gòu)物車結(jié)算情景)
 car_id := c.Query("car_id")
 if car_id == "" {
 c.JSON(200, gin.H{"msg": "car_id1不得為空!", "car_id": car_id})
 return
 }
 
 //查找購(gòu)物車中的商品id
 ids, _ := strconv.ParseInt(car_id, 10, 64)
 car := &models.Car{Car_id: ids}
 models.X.Get(car)
 
 /**
 * goods表庫(kù)存減去銷量
 */
 //查詢商品
 goods := &models.Goods{Goods_id: car.Goods_id}
 models.X.Get(goods)
 //更新庫(kù)存
 good := models.Goods{}
 good.Stock = goods.Stock - car.Num
 rel4, err4 := session.ID(car.Goods_id).Update(good)
 if rel4 == 0 || err4 != nil {
 session.Rollback()
 c.JSON(200, gin.H{"err4": err4, "rel4": rel4, "carid": car.Goods_id, "goodsid": goods.Goods_id, "Stock": good.Stock})
 return
 }
 
 /**
 * 用戶扣費(fèi)
 */
 //查詢用戶
 user := &models.User{User_id: car.User_id}
 models.X.Get(user)
 //更新價(jià)格
 user_up := models.User{}
 user_up.Balance = user.Balance - car.Total_price
 rel1, err1 := session.ID(car.User_id).Update(user_up)
 if err1 != nil || rel1 == 0 {
 session.Rollback()
 c.JSON(200, gin.H{"err1": err1, "rel1": rel1})
 return
 }
 
 /**
 * 刪除用戶的購(gòu)物車信息
 */
 rel2, err2 := session.Delete(car)
 if err2 != nil || rel2 == 0 {
 session.Rollback()
 c.JSON(200, gin.H{"err2": err2, "rel2": rel2})
 return
 }
 if user_up.Balance <= 0 {
 session.Rollback()
 c.JSON(200, gin.H{"msg": "余額不足"})
 return
 }
 
 err3 := session.Commit()
 if err3 != nil {
 c.JSON(200, gin.H{"err3": err3})
 return
 }
 c.JSON(200, gin.H{"msg": "用戶扣費(fèi)成功"})
}
 
func update_goods(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id1不得為空!", "id": id})
 return
 }
 //string轉(zhuǎn)換int64
 ids, err := strconv.ParseInt(id, 10, 64)
 
 goods_name := c.Query("goods_name")
 if goods_name == "" {
 c.JSON(200, gin.H{"msg": "goods_name不得為空!", "goods_name": goods_name})
 return
 }
 
 price := c.Query("price")
 if price == "" {
 c.JSON(200, gin.H{"msg": "price不得為空!", "price": price})
 return
 }
 prices, _ := strconv.ParseFloat(price, 64)
 
 stock := c.Query("stock")
 if stock == "" {
 c.JSON(200, gin.H{"msg": "stock不得為空!", "stock": stock})
 return
 }
 stocks, _ := strconv.ParseInt(stock, 10, 64)
 
 //修改
 goods := models.Goods{}
 goods.Stock = stocks
 goods.Goods_name = goods_name
 goods.Price = prices
 rel, err := models.X.ID(ids).Update(goods)
 if rel == 0 || err != nil {
 c.JSON(200, gin.H{"msg": "修改失敗", "err": err, "stocks": stocks, "goods_name": goods_name, "prices": prices, "id": id})
 } else {
 c.JSON(200, gin.H{"msg": "修改成功"})
 }
}
 
func shiwu(c *gin.Context) {
 session := models.X.NewSession()
 defer session.Close()
 
 err := session.Begin()
 user1 := models.User{Name: "xiaoxiao1", Balance: 100}
 _, err = session.Insert(&user1)
 if err != nil {
 return
 }
 
 session.Rollback()
 data := make(map[string]interface{})
 data["msg"] = "錯(cuò)誤"
 c.JSON(200, session)
 c.JSON(200, data)
 return
 
 //提交
 err = session.Commit()
 if err != nil {
 return
 }
}
 
func main() {
 r := gin.Default()
 r.GET("/insert", insert)
 r.GET("/get", get)
 r.GET("/find", find)
 r.GET("/updates", updates)
 r.GET("/delte", delte)
 r.GET("/update_goods", update_goods)
 r.GET("/gun", gun)
 r.GET("/shiwu", shiwu)
 r.Run(":88")
}

需要填坑的是:這里面我使用事務(wù)一直實(shí)現(xiàn)不了回滾,再次細(xì)致閱讀文檔才發(fā)現(xiàn),

而關(guān)于innodb的設(shè)置方法,這里有一個(gè)很好的教程 //www.dbjr.com.cn/article/202470.htm

補(bǔ)充:golang xorm MSSQL where查詢案例

xorm官方中文文檔 參考 http://xorm.io/docs/

以sqlserver為例

先初始化連接等...

engine, err := xorm.NewEngine("mssql", "server=127.0.0.1;user id=sa;password=123456;database=dbname")
//控制臺(tái)打印SQL語(yǔ)句
engine.ShowSQL(true)
if err != nil {
 fmt.Println(err)
}
defer engine.Close()

一、查詢案例

ids := []model.MsIdcaid{} //實(shí)體定義的話自己寫
engine.Cols("Id", "Address").Where("id in(2,3,4,5,6)").OrderBy("id desc,address asc").Find(&ids)
//[SQL] SELECT "Id", "Address" FROM "cdsgus" WHERE (id in(2,3,4,5,6)) ORDER BY id desc,address asc
或者直接自己寫SQL
engine.SQL("SELECT Address from cdsgus where id in (2,3,4,6) order by id desc ").Find(&ids)
//[SQL] SELECT Address from cdsgus where id in (2,3,4,6) order by id desc 

二、分頁(yè)查詢

方式一 :用Limit(int i,int j) 方法, i=要取的條數(shù), j=開(kāi)始的位置

MSSQL 雖然執(zhí)行的結(jié)果正確,可以看到生成的分頁(yè)SQL很亂,建議直接MSSQL分頁(yè)直接用方式二寫在SQL里。其他數(shù)據(jù)庫(kù)應(yīng)該是沒(méi)有問(wèn)題, 如:mysql

其實(shí)本文用數(shù)據(jù)庫(kù)的版本SQL2014 是支持:OFFSET 2 ROW FETCH NEXT 10 ROW ONLY的寫法的,xorm并未識(shí)別數(shù)據(jù)庫(kù)的版本調(diào)整分頁(yè)SQL

engine.Cols("Id", "Name").Where("id in(2,3,4,5,6)").OrderBy("id desc,address asc").Limit(10, 2).Find(&ids)
//[[SQL] SELECT TOP 10 "Id", "Name" FROM "cdsgus" WHERE (id in(2,3,4,5,6)) AND (id NOT IN (SELECT TOP 2 id FROM "cdsgus" WHERE (id in(2,3,4,5,6)) ORDER BY id desc,address asc)) ORDER BY id desc,address asc

方式二 :用原生的SQL方法 ,很妥

engine.SQL("SELECT Id,Name from cdsgus where id in (2,3,4,5,6) order by id desc OFFSET 2 ROW FETCH NEXT 10 ROW ONLY").Find(&ids)
//[SQL] SELECT Id,Name from cdsgus where id in (2,3,4,5,6) order by id desc OFFSET 2 ROW FETCH NEXT 10 ROW ONLY

方式三 :用原生的SQL + Limit 方法 ??MSSQL居然是錯(cuò)誤SQL&結(jié)果

engine.Sql("SELECT Id,Name from cdsgus where id in (2,3,4,5,6) ").OrderBy("id").Limit(10, 2).Find(&ids)
//[SQL] SELECT Id,Name from cdsgus where id in (2,3,4,5,6) 
data, _ := engine.Sql("SELECT Id,Name from cdsgus where id in (2,3,4,5,6) ").OrderBy("id").Limit(10, 2).Query()
//[SQL] SELECT Id,Name from cdsgus where id in (2,3,4,5,6) 

方式四 : github.com/go-xorm/builder

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn)

    Go語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn)

    這篇文章主要介紹了Go語(yǔ)言json編碼駝峰轉(zhuǎn)下劃線、下劃線轉(zhuǎn)駝峰的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Go語(yǔ)言中append函數(shù)用法分析

    Go語(yǔ)言中append函數(shù)用法分析

    這篇文章主要介紹了Go語(yǔ)言中append函數(shù)用法,對(duì)比使用append函數(shù)與不使用append函數(shù)的兩個(gè)實(shí)例,詳細(xì)分析了Go語(yǔ)言中append函數(shù)的功能,需要的朋友可以參考下
    2015-02-02
  • Go panic和recover函數(shù)使用細(xì)節(jié)深入探究

    Go panic和recover函數(shù)使用細(xì)節(jié)深入探究

    這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細(xì)節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang實(shí)現(xiàn)驗(yàn)證一個(gè)字符串是否為URL

    Golang實(shí)現(xiàn)驗(yàn)證一個(gè)字符串是否為URL

    在實(shí)際開(kāi)發(fā)過(guò)程中,有時(shí)候會(huì)遇到?URL?的校驗(yàn)問(wèn)題,Go?語(yǔ)言中有哪些方法去驗(yàn)證一個(gè)字符串是否滿足?URL?格式呢?本文就來(lái)和大家詳細(xì)講講
    2023-04-04
  • Go語(yǔ)言Http調(diào)用之Post請(qǐng)求詳解

    Go語(yǔ)言Http調(diào)用之Post請(qǐng)求詳解

    前文我們介紹了如何進(jìn)行 HTTP 調(diào)用,并通過(guò) GET 請(qǐng)求的例子,講述了 query 參數(shù)和 header 參數(shù)如何設(shè)置,以及響應(yīng)體的獲取方法。 本文繼上文,接下來(lái)會(huì)通過(guò) POST 請(qǐng)求,對(duì)其他參數(shù)的設(shè)置進(jìn)行介紹,感興趣的可以了解一下
    2022-12-12
  • 通過(guò)Go channel批量讀取數(shù)據(jù)的示例詳解

    通過(guò)Go channel批量讀取數(shù)據(jù)的示例詳解

    批量處理的主要邏輯是:從 channel 中接收數(shù)據(jù),積累到一定數(shù)量或者達(dá)到時(shí)間限制后,將數(shù)據(jù)批量處理(例如發(fā)送到 Kafka 或者寫入網(wǎng)絡(luò)),下面我將展示一個(gè)從 Go channel 中批量讀取數(shù)據(jù),并批量發(fā)送到 Kafka 和批量寫入網(wǎng)絡(luò)數(shù)據(jù)的示例,需要的朋友可以參考下
    2024-10-10
  • Go語(yǔ)言中定時(shí)器cron的基本使用教程

    Go語(yǔ)言中定時(shí)器cron的基本使用教程

    這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中定時(shí)器cron使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法

    一文帶你了解Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法

    strings?庫(kù)包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來(lái)和大家分享一下Go標(biāo)準(zhǔn)庫(kù)strings的常用函數(shù)和方法,希望對(duì)大家有所幫助
    2022-11-11
  • Go/C語(yǔ)言LeetCode題解997找到小鎮(zhèn)法官

    Go/C語(yǔ)言LeetCode題解997找到小鎮(zhèn)法官

    這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • golang使用go test輸出單元測(cè)試覆蓋率的方式

    golang使用go test輸出單元測(cè)試覆蓋率的方式

    單元測(cè)試覆蓋率是衡量代碼質(zhì)量的一個(gè)重要指標(biāo),重要的代碼文件覆蓋率應(yīng)該至少達(dá)到80%以上,Java 可以通過(guò)JaCoCo 統(tǒng)計(jì)覆蓋率,那么go 項(xiàng)目如何進(jìn)行代碼覆蓋率測(cè)試呢,本文將給大家詳細(xì)的介紹一下golang使用go test輸出單元測(cè)試覆蓋率的方式,需要的朋友可以參考下
    2024-02-02

最新評(píng)論