Go-xorm入门 |青训营笔记

232 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

Go-xorm库

xorm是一个简单强大的Go语言ORM库,通过它可以使数据库操作非常简便。

特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

同步结构体和数据表

import (
   "fmt"
   _ "github.com/go-sql-driver/mysql"
   "time"
   "xorm.io/xorm"
)

func main() {
   //数据库连接基本信息
   var (
      userName  string = "root"
      password  string = "qqq111"
      ipAddress string = "127.0.0.1"
      port      int    = 3306
      dbName    string = "go_test"
      charset   string = "utf8mb4"
   )

   // 构建数据库连接信息
   dataSource := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", userName, password, ipAddress, port, dbName, charset)

   engine, err := xorm.NewEngine("mysql", dataSource)

   if err != nil {
      fmt.Println("数据库连接失败!")
   }

   type User struct {
      Id       int64
      Name     string
      Age      int
      password string    `xorm:"varchar(200)"`
      Createa  time.Time `xorm:"created"`
      updated  time.Time `xorm:"updated"`
   }
   //创建表
   err = engine.Sync(new(User))
   if err != nil {
      fmt.Println("表结构同步失败!")
   }
}

数据插入

通过返回的engine.insert插入数据

// engine.Insert() 插入 对象,返回值:受影响的行数
user := User{Id: 10000, Name: "kuangshen", Age: 18, password: "123456"}
// 受影响的行数
n, _ := engine.Insert(&user)
if n > 1 {
   fmt.Println("数据插入成功!")
}
fmt.Println(n)

批量插入的话,使用切片添加

//切片
var users []User
users = append(users, User{Id: 10003, Name: "kuangshen1", Age: 18, password: "137QQQQ"})
users = append(users, User{Id: 10004, Name: "kuangshen1", Age: 18, password: "137QQQQ"})
n, _ = engine.Insert(users)

更新与删除

  • Update 更新数据,默认只更新非空和非0的字段
  • Delete 删除记录,需要注意,删除必须至少有一个条件,否则会报错
  • Exec执行一个SQL语句
//更新
user := User{Name: "qingjiang", Age: 80}
n, _ := engine.ID(1000).Update(&user)
fmt.Println(n)

image.png

删除

user := User{Name: "qingjiang", Age: 80}
n, _ := engine.ID(1000).Delete(&user)
fmt.Println(n)

image.png

还可以通过执行SQL语句

engine.Exec("update user set age=? where id =?",10,10004)

数据查询

  • query 最原始的也支持SQL语句查询,返回的结果类型为[]map[string][]byte,QueryString 返回[]map[string]string,QueryInterface返回[]map[string]interface{}.
  • Get查询单条记录
  • Find查询多条记录
  • Count 获取记录条数
  • IterateRows 根据条件遍历数据