• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang中xorm的基本使用说明

    简单的用法

    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框架的使用
    上一篇:解决goxorm无法更新值为默认值的问题
    下一篇:golang gorm多条件筛选查询操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang中xorm的基本使用说明 golang,中,xorm,的,基本,使用说明,