当前位置: 首页 > news >正文

Go XORM学习

文章目录

  • XORM
  • 安装
  • 同步结构体到数据库
  • 数据插入
  • 更新与删除
  • 条件查询和遍历输出
  • 事务处理

XORM

一个简答强大的Go语言ORM库。
操作数据库的东西。
官网:https://xorm.io/

文档:https://gitea.com/xorm/xorm/src/branch/master/README_CN.md

安装

请确保你的 Go 版本在 1.8+ 以上可以如下安装。
三选一

go get xorm.io/xorm
go get -u github.com/xormplus/xorm
go get github.com/go-xorm/xorm

下载mysql的驱动:

go get -u github.com/go-sql-driver/mysql

同步结构体到数据库

package main  
  
import (  
   "fmt"  
   _ "github.com/go-sql-driver/mysql"  
   "time"   "xorm.io/xorm")  
  
func main() {  
   var (  
      username = "root"  
      password = "root"  
      ip       = "127.0.0.1"  
      potr     = 3306  
      dbName   = "go_test"  
      charset  = "utf8mb4"  
   )  
   //1.创建数据库引擎对象  
   dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, potr, dbName, charset)  
   engine, err := xorm.NewEngine("mysql", dataSourceName)  
  
   if err != nil {  
      panic(err.Error())  
   }  
  
   //2.数据库引擎关闭  
   defer engine.Close()  
  
   type User struct {  
      Id      int64  
      Name    string  
      Salt    string  
      Age     int  
      Passwd  string    `xorm:"varchar(200)"`  
      Created time.Time `xorm:"created"`  
      Updated time.Time `xorm:"updated"`  
   }  
   err1 := engine.Sync(new(User))  
   if err1 != nil {  
      panic(err1.Error())  
   }  
}

数据插入

  • insert 插入数据
package main  
  
import (  
   "fmt"  
   _ "github.com/go-sql-driver/mysql"  
   "time"   "xorm.io/xorm")  
  
func main() {  
   var (  
      username = "root"  
      password = "root"  
      ip       = "127.0.0.1"  
      potr     = 3306  
      dbName   = "go_test"  
      charset  = "utf8mb4"  
   )  
   //1.创建数据库引擎对象  
   dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, potr, dbName, charset)  
   engine, err := xorm.NewEngine("mysql", dataSourceName)  
  
   if err != nil {  
      panic(err.Error())  
   }  
  
   //2.数据库引擎关闭  
   defer engine.Close()  
  
   type User struct {  
      Id      int64  
      Name    string  
      Salt    string  
      Age     int  
      Passwd  string    `xorm:"varchar(200)"`  
      Created time.Time `xorm:"created"`  
      Updated time.Time `xorm:"updated"`  
   }  
   err1 := engine.Sync(new(User))  
   if err1 != nil {  
      panic(err1.Error())  
   }  
  
   // 插入数据  返回值:受影响的行数  下面是插入单条数据的  
   user := User{  
      Id:     10,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   }  
   n, _ := engine.Insert(&user)  
  
   if n >= 1 {  
      fmt.Println("数据插入成功")  
   }  
  
   //插入多个数据  
  
   user1 := User{  
      Id:     2,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   }  
   user2 := User{  
      Id:     3,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   }  
   user3 := User{  
      Id:     4,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   }  
   n, _ = engine.Insert(&user1, &user2, &user3)  
   fmt.Println(n)  
  
   //User切片的添加。  
   var users []User  
   users = append(users, User{  
      Id:     5,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   })  
   users = append(users, User{  
      Id:     6,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   })  
   users = append(users, User{  
      Id:     7,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   })  
   users = append(users, User{  
      Id:     8,  
      Name:   "simple",  
      Age:    10,  
      Passwd: "simple",  
   })  
  
   n, _ = engine.Insert(&users)  
  
   fmt.Println(n)  
  
}

更新与删除

  • update更新数据,默认只更新非空和非0的字段
  • Delete删除记录 , 需要注意,删除必须至少有一个条件,否则会报错。
  • Exec执行一个SQL语句。
package main  
  
import (  
   "fmt"  
   _ "github.com/go-sql-driver/mysql"  
   "time"   "xorm.io/xorm")  
  
func main() {  
   var (  
      username = "root"  
      password = "root"  
      ip       = "127.0.0.1"  
      potr     = 3306  
      dbName   = "go_test"  
      charset  = "utf8mb4"  
   )  
   //1.创建数据库引擎对象  
   dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, potr, dbName, charset)  
   engine, err := xorm.NewEngine("mysql", dataSourceName)  
  
   if err != nil {  
      panic(err.Error())  
   }  
  
   //2.数据库引擎关闭  
   defer engine.Close()  
  
   type User struct {  
      Id      int64  
      Name    string  
      Salt    string  
      Age     int  
      Passwd  string    `xorm:"varchar(200)"`  
      Created time.Time `xorm:"created"`  
      Updated time.Time `xorm:"updated"`  
   }  
   err1 := engine.Sync(new(User))  
   if err1 != nil {  
      panic(err1.Error())  
   }  
   //更新  
   user := User{Name: "complex"}  
   n, _ := engine.ID(1).Update(&user)  
   //把id为1的Name变成complex  
   fmt.Println(n)  
   //删除  
   user = User{Name: "simple"}  
   n, _ = engine.ID(10).Delete(&user)  
   //把id为10的且名字是simple的删除。  
   fmt.Println(n)  
  
   //     Exec() 执行SQL语句  
   engine.Exec("update user set age = ? where id = ?", 11, 1)  
}

条件查询和遍历输出

  • Query最原始的与支持SQL语句查询,返回的结构类型为[]map[string][]byte。QueryString返回[]map[string]string。QueryInterface返回[]map[string]interface{}
  • GET 查询单条记录
  • Find 查询多条记录
  • Count 获取记录的条数
  • Iterate和Rows根据条件遍历数据。
package main  
  
import (  
   "fmt"  
   _ "github.com/go-sql-driver/mysql"  
   "time"   "xorm.io/xorm")  
  
func main() {  
   var (  
      username = "root"  
      password = "root"  
      ip       = "127.0.0.1"  
      potr     = 3306  
      dbName   = "go_test"  
      charset  = "utf8mb4"  
   )  
   //1.创建数据库引擎对象  
   dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, potr, dbName, charset)  
   engine, err := xorm.NewEngine("mysql", dataSourceName)  
  
   if err != nil {  
      panic(err.Error())  
   }  
  
   //2.数据库引擎关闭  
   defer engine.Close()  
  
   type User struct {  
      Id      int64  
      Name    string  
      Salt    string  
      Age     int  
      Passwd  string    `xorm:"varchar(200)"`  
      Created time.Time `xorm:"created"`  
      Updated time.Time `xorm:"updated"`  
   }  
   err1 := engine.Sync(new(User))  
   if err1 != nil {  
      panic(err1.Error())  
   }  
  
   //查询  
   //results1, _ := engine.Query("select * from user")  
   //fmt.Println(results1)   //results2, _ := engine.QueryString("select * from user")   //fmt.Println(results2)   //results3, _ := engine.QueryInterface("select * from user")   //fmt.Println(results3)  
   // Get 只能查询单条。  
   user := User{}  
   engine.Get(&user)  
   //select * from user limit 1  
   fmt.Println(user)  
  
   // 指定条件来查询用户  
   user1 := User{  
      Name: "complex",  
   }  
   engine.Where("name=?", user1.Name).Desc("id").Get(&user1)  
   fmt.Println(user1)  
  
   // 只查询某个字段  
   var name string  
   engine.Table(&user).Where("id = 1").Cols("name").Get(&name)  
   fmt.Println(name)  
  
   // Find查询多条记录  
   var users []User  
   err = engine.Where("age > 1").Find(&users)  
   if err != nil {  
      panic(err.Error())  
   }  
   fmt.Println(users)  
   // count 获取记录条数  
   user = User{  
      Passwd: "simple",  
   }  
   count, err := engine.Count(&user)  
   if err != nil {  
      panic(err.Error())  
   }  
   fmt.Println(count)  
   // 遍历数据表中的信息  
   engine.Iterate(&User{Passwd: "simple"}, func(idx int, bean interface{}) error {  
      user := bean.(*User)  
      fmt.Println(user)  
      return nil  
   })  
  
   rows, err := engine.Rows(&User{Passwd: "simple"})  
   defer rows.Close()  
   userBean := new(User)  
   for rows.Next() {  
      rows.Scan(userBean)  
      fmt.Println(userBean)  
   }  
}

事务处理

🦓

package main  
  
import (  
   "fmt"  
   _ "github.com/go-sql-driver/mysql"  
   "time"   "xorm.io/xorm")  
  
func main() {  
   var (  
      username = "root"  
      password = "root"  
      ip       = "127.0.0.1"  
      potr     = 3306  
      dbName   = "go_test"  
      charset  = "utf8mb4"  
   )  
   //1.创建数据库引擎对象  
   dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, potr, dbName, charset)  
   engine, err := xorm.NewEngine("mysql", dataSourceName)  
  
   if err != nil {  
      panic(err.Error())  
   }  
  
   //2.数据库引擎关闭  
   defer engine.Close()  
  
   type User struct {  
      Id      int64  
      Name    string  
      Salt    string  
      Age     int  
      Passwd  string    `xorm:"varchar(200)"`  
      Created time.Time `xorm:"created"`  
      Updated time.Time `xorm:"updated"`  
   }  
   err1 := engine.Sync(new(User))  
   if err1 != nil {  
      panic(err1.Error())  
   }  
   // 事务  
   session := engine.NewSession()  
   defer session.Close()  
   //开启事务  
   session.Begin()  
   user1 := User{  
      Id:      9,  
      Name:    "simple9",  
      Salt:    "s",  
      Age:     12,  
      Passwd:  "simple",  
      Created: time.Time{},  
      Updated: time.Time{},  
   }  
   defer func() {  
      err := recover()  
      if err != nil {  
         println(err)  
         fmt.Println("Rollback")  
         session.Rollback()  
      } else {  
         session.Commit()  
      }  
   }()  
   _, err = session.Insert(&user1)  
   if err != nil {  
      panic(err)  
   }  
   user2 := User{  
      Name: "complexxxx",  
   }  
   _, err = session.Where("id = 3").Update(&user2)  
   if err != nil {  
      panic(err)  
   }  
  
}

相关文章:

  • 【golang/go语言】go语言中包的使用、Init()函数、协程和接口
  • 【电源专题】JEITA学习
  • cadence SPB17.4 S032 - PSpice - 仿真元件参数的含义 - 以VSIN为例
  • 印刷线路板焊盘和金手指自动光学检测研究
  • 算法刷题打卡第81天:兼具大小写的最好英文字母
  • 【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)
  • go-zero源码阅读-布隆过滤器
  • 数组试题(Python实现)
  • PHP 杂项 函数
  • Mybatis持久层框架 | CRUD
  • 内网渗透(八)之基础知识-企业域中计算机分类和专业名
  • Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏
  • 周赛331总结
  • SSM整合知识点记录
  • 设计模式-模板方法模式
  • MySQL数据库01——mysql的安装和配置(包含workbench安装,超详细)
  • 2/4考试总结
  • Ta-Lib源码解析(三):蜡烛图指标 (Candlestick Indicator) #(附Python重构代码和示意图)(补充中)
  • 【嵌入式】MDK使用sct文件将代码段放入RAM中执行
  • 《基于Xilinx的时序分析、约束和收敛》目录与传送门
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉