婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > golang中xorm的基本使用說明

golang中xorm的基本使用說明

熱門標簽:鄭州智能語音電銷機器人價格 仙桃400電話辦理 不封卡外呼系統 宿遷便宜外呼系統代理商 湛江crm外呼系統排名 地圖標注免費定制店 寧波語音外呼系統公司 重慶慶云企業400電話到哪申請 上海極信防封電銷卡價格

簡單的用法

package main 
import (
 _ "github.com/go-sql-driver/mysql"
 "github.com/go-xorm/xorm"
 "log"
)
 
//定義結構體(xorm支持雙向映射)
type User struct {
 User_id int64 `xorm:"pk autoincr"` //指定主鍵并自增
 Name string `xorm:"unique"` //唯一的
 Balance float64
 Time int64 `xorm:"updated"` //修改后自動更新時間
 Creat_time int64 `xorm:"created"` //創建時間
 //Version int `xorm:"version"` //樂觀鎖
}
 
//定義orm引擎
var x *xorm.Engine 
//創建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("數據庫連接失敗:", err)
 }
 if err := x.Sync(new(User)); err != nil {
 log.Fatal("數據表同步失敗:", 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("錯誤:", 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("搜索結果不存在!")
 }
 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": "添加錯誤", "err": err, "rel": rel})
 } else {
 c.JSON(200, gin.H{"msg": "添加成功"})
 }
}
 
//查詢單個操作
func get(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id不得為空!"})
 return
 }
 //string轉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": "查詢錯誤"})
 } 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": "修改錯誤!", "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轉化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": "刪除錯誤!", "rel": rel, "err": err, "user": user})
 } else {
 c.JSON(200, gin.H{"mag": "刪除成功"})
 }
}
 
//事務的提交以及回滾
func gun(c *gin.Context) {
 //創建session
 session := models.X.NewSession()
 defer session.Close()
 //創建事務
 err := session.Begin()
 if err != nil {
 c.JSON(200, gin.H{"err": err})
 return
 }
 //操作事務,失敗并回滾(模擬購物車結算情景)
 car_id := c.Query("car_id")
 if car_id == "" {
 c.JSON(200, gin.H{"msg": "car_id1不得為空!", "car_id": car_id})
 return
 }
 
 //查找購物車中的商品id
 ids, _ := strconv.ParseInt(car_id, 10, 64)
 car := models.Car{Car_id: ids}
 models.X.Get(car)
 
 /**
 * goods表庫存減去銷量
 */
 //查詢商品
 goods := models.Goods{Goods_id: car.Goods_id}
 models.X.Get(goods)
 //更新庫存
 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
 }
 
 /**
 * 用戶扣費
 */
 //查詢用戶
 user := models.User{User_id: car.User_id}
 models.X.Get(user)
 //更新價格
 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
 }
 
 /**
 * 刪除用戶的購物車信息
 */
 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": "用戶扣費成功"})
}
 
func update_goods(c *gin.Context) {
 id := c.Query("id")
 if id == "" {
 c.JSON(200, gin.H{"msg": "id1不得為空!", "id": id})
 return
 }
 //string轉換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"] = "錯誤"
 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")
}

需要填坑的是:這里面我使用事務一直實現不了回滾,再次細致閱讀文檔才發現,

而關于innodb的設置方法,這里有一個很好的教程 //www.jb51.net/article/202470.htm

補充: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")
//控制臺打印SQL語句
engine.ShowSQL(true)
if err != nil {
 fmt.Println(err)
}
defer engine.Close()

一、查詢案例

ids := []model.MsIdcaid{} //實體定義的話自己寫
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 

二、分頁查詢

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

MSSQL 雖然執行的結果正確,可以看到生成的分頁SQL很亂,建議直接MSSQL分頁直接用方式二寫在SQL里。其他數據庫應該是沒有問題, 如:mysql

其實本文用數據庫的版本SQL2014 是支持:OFFSET 2 ROW FETCH NEXT 10 ROW ONLY的寫法的,xorm并未識別數據庫的版本調整分頁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居然是錯誤SQL結果

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 在golang xorm中使用postgresql的json,array類型的操作
  • golang xorm及time.Time自定義解決json日期格式的問題
  • golang xorm日志寫入文件中的操作
  • go語言 xorm框架 postgresql 的用法及詳細注解
  • 解決goxorm無法更新值為默認值的問題
  • xorm根據數據庫生成go model文件的操作
  • 使用go xorm來操作mysql的方法實例
  • go xorm框架的使用

標簽:物業服務 海南 儋州 西雙版納 青海 安康 遼寧 電子產品

巨人網絡通訊聲明:本文標題《golang中xorm的基本使用說明》,本文關鍵詞  golang,中,xorm,的,基本,使用說明,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中xorm的基本使用說明》相關的同類信息!
  • 本頁收集關于golang中xorm的基本使用說明的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    日本久久一区二区三区| 午夜欧美2019年伦理| 中文字幕一区二区日韩精品绯色| 久久蜜桃av一区精品变态类天堂 | 国产精品毛片高清在线完整版| 亚洲不卡一区二区三区| 国产91在线|亚洲| 欧美mv日韩mv亚洲| 亚洲一区二区三区影院| 不卡一区二区在线| 国产亚洲一区二区在线观看| 日韩**一区毛片| 制服视频三区第一页精品| 婷婷六月综合亚洲| 欧美日本免费一区二区三区| 亚洲久草在线视频| 97超碰欧美中文字幕| 亚洲色图第一区| 亚洲大片免费看| 久久青草国产手机看片福利盒子| 99国产精品一区| 捆绑变态av一区二区三区| wwwwww.欧美系列| 欧洲国内综合视频| 国产成人av电影在线| 天堂精品中文字幕在线| 精品999在线播放| 欧美日韩激情一区| 亚洲成人先锋电影| 99久久精品国产观看| 亚洲国产精品久久一线不卡| 69精品人人人人| 国产乱妇无码大片在线观看| 国产精品乱人伦| 欧美日韩精品福利| 国产精品538一区二区在线| 国产精品久久久久天堂| 色8久久人人97超碰香蕉987| 久久精品国产秦先生| 国产精品福利在线播放| 在线电影院国产精品| 99久久精品国产麻豆演员表| 麻豆国产91在线播放| 亚洲精品国产一区二区三区四区在线 | 日韩欧美国产综合一区| 成人av影视在线观看| 婷婷丁香激情综合| 国产欧美日韩在线| 欧美日韩在线三区| 国产精品一卡二| 日产国产欧美视频一区精品| 亚洲777理论| 欧美日韩二区三区| 丝袜美腿亚洲一区| 精品动漫一区二区三区在线观看| 亚洲色图在线看| 色香色香欲天天天影视综合网| 精品久久一区二区三区| 亚洲午夜久久久久久久久久久 | 日韩一级二级三级| 久久99国产精品成人| 欧美精品一区二区三区高清aⅴ| 肉丝袜脚交视频一区二区| 99视频一区二区三区| 午夜影视日本亚洲欧洲精品| 日韩免费视频一区| 欧美日韩亚州综合| 欧美在线|欧美| 99久久精品国产导航| 北条麻妃一区二区三区| 精品一区二区三区在线播放| 亚洲影院免费观看| 亚洲一区二区三区爽爽爽爽爽| 亚洲日韩欧美一区二区在线| 国产精品视频yy9299一区| 日韩欧美成人激情| 777亚洲妇女| 欧美精品 日韩| 日韩一区和二区| 日韩精品一区二区在线观看| 日韩一区国产二区欧美三区| 日韩精品一区二区三区蜜臀 | 久久久久久久久97黄色工厂| 91精品欧美综合在线观看最新| 欧美日韩黄色一区二区| 3atv一区二区三区| 久久久久久久久久久99999| 亚洲精品在线观看网站| 国产精品丝袜久久久久久app| 亚洲欧洲一区二区在线播放| 天天综合色天天| 亚洲妇熟xx妇色黄| 日韩一区精品字幕| 国产精品一区二区免费不卡| 色一情一伦一子一伦一区| 中文久久乱码一区二区| 粉嫩av一区二区三区在线播放| 欧美二区三区的天堂| 午夜电影网一区| 欧美老女人在线| 天天色图综合网| 精品电影一区二区| 欧美老年两性高潮| 丁香啪啪综合成人亚洲小说| 制服视频三区第一页精品| 亚洲国产日韩在线一区模特| 欧美色精品天天在线观看视频| 亚洲手机成人高清视频| 色婷婷综合久久久久中文一区二区| 久久久精品2019中文字幕之3| 国产精品18久久久| 日韩视频免费观看高清完整版 | 久久精品网站免费观看| 成人在线视频一区| 乱一区二区av| 亚洲国产乱码最新视频| 久久精品一区二区三区不卡| 精品三级av在线| 91丨porny丨蝌蚪视频| 国产乱人伦偷精品视频不卡 | 26uuu亚洲| 久久久久久亚洲综合| 国产丝袜美腿一区二区三区| 久久久久97国产精华液好用吗| 久久久夜色精品亚洲| 中文字幕精品—区二区四季| 亚洲欧美自拍偷拍| 国产精品对白交换视频| 国产欧美一区二区三区在线看蜜臀| 精品国产乱码91久久久久久网站| 精品捆绑美女sm三区| 欧美三电影在线| 欧美欧美欧美欧美首页| 欧美日韩一二区| 51精品国自产在线| 日韩欧美成人激情| 国产欧美日韩视频一区二区 | 粉嫩13p一区二区三区| 精品系列免费在线观看| 日韩精品一级中文字幕精品视频免费观看 | 国产在线麻豆精品观看| 蜜桃av一区二区| 国内精品伊人久久久久av一坑| 国产二区国产一区在线观看| 欧美性欧美巨大黑白大战| 日韩三级中文字幕| 中文字幕乱码久久午夜不卡 | 懂色av一区二区在线播放| 91视频一区二区三区| 色哟哟国产精品| 欧美不卡一区二区三区四区| 国产精品动漫网站| 免费成人结看片| 成人一区在线观看| 欧美va亚洲va| 亚洲日本va午夜在线电影| 日韩制服丝袜先锋影音| 91小视频免费观看| 日本一区二区综合亚洲| 久久99久久久欧美国产| 欧美日本一区二区三区| 亚洲一区二区视频在线| 欧美日韩精品一区二区三区四区| 亚洲一区二区三区在线| 宅男在线国产精品| 国模无码大尺度一区二区三区| 精品入口麻豆88视频| 亚洲一区二区三区四区五区中文| 成人精品免费网站| 国产午夜三级一区二区三| 日本不卡免费在线视频| 久久青草欧美一区二区三区| 欧美国产亚洲另类动漫| 亚洲一区自拍偷拍| 欧美日韩在线直播| 欧美色视频在线| 视频一区二区三区在线| 亚洲精品一区二区三区在线观看| 激情久久五月天| 亚洲手机成人高清视频| 制服丝袜亚洲播放| 成人av动漫网站| 久久福利资源站| av在线播放成人| 久久综合视频网| 91精品国产麻豆国产自产在线| 91原创在线视频| 久久99久久久欧美国产| 99国产精品国产精品毛片| 老色鬼精品视频在线观看播放| 成人黄色在线网站| 一区二区三区成人| 成人欧美一区二区三区黑人麻豆| 日韩精品一区二区三区老鸭窝| 欧美喷水一区二区| 色综合久久久久综合体| 成人高清视频在线| 五月婷婷另类国产| 中文字幕精品一区二区精品绿巨人| 2024国产精品|