XORM

eXtra ORM for Go

XORM 是一个简单而强大的 Go 语言 ORM 框架。

1. 特性

  • 支持Struct和数据库表之间的灵活映射,并支持自动同步。
  • 事务支持
  • 同时支持原始SQL语句和ORM操作的混合执行。
  • 使用连写来简化调用。
  • 支持使用ID, In, Where, Limit, Join, Having, Table, SQL, Cols等函数和结构体等方式作为条件。

2. 安装

go get "xorm.io/xorm"

3. 使用

同步结构体到数据库

  • 创建引擎,driverName, datasourceName, 和database/Sql相同。
  • 定义一个和表同步的结构体,并且自动同步结构体到数据库。
package main

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

func main() {
    var (
        userName  string = "root"
        password  string = "root"
        ipAddress string = "192.168.1.104"
        port      string = "3306"
        dbName    string = "test"
        charset   string = "utf8mb4"
    )
    dbSourceName := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", userName, password, ipAddress, port, dbName, charset)

    engine, err := xorm.NewEngine("mysql", dbSourceName)
    if nil != err {
        fmt.Println("连接失败", err)
    }

    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"`
    }

    // engine.Sync
    err = engine.Sync(new(User))
    if nil != err {
        fmt.Println("表结构同步失败", err)
    }

}

数据插入

  • Insert插入一条或者多条记录。
// 插入对象
user := User{Id: 1000, Name: "root", Age: 18, Passwd: "123456"}
insert, _ := engine.Insert(&user)
fmt.Println("受影响的行数", insert)

user1 := User{Id: 10001, Name: "root", Age: 18, Passwd: "123456"}
user2 := User{Id: 10002, Name: "root", Age: 18, Passwd: "123456"}
insert, _ = engine.Insert(&user1, &user2)
fmt.Println("受影响的行数", insert)

var users []User
users = append(users, User{Id: 10003, Name: "root", Age: 18, Passwd: "123456"})
users = append(users, User{Id: 10004, Name: "root", Age: 18, Passwd: "123456"})
insert, _ = engine.Insert(&users)
fmt.Println("受影响的行数", insert)

更新与删除

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

// .Delete
user = User{Name: "root"}
i, _ := engine.ID(10001).Delete(&user)
fmt.Println("受影响的行数", i)

// .Exec
result, _ := engine.Exec("update user set age = ? where id = ?", 10, 10004)
fmt.Println(result)

数据查询

  • Query最原始支持SQL语句查询,返回的结果类型为[]map[string][]byteQueryString返回[]map[string]stringQueryInterface返回[]map[string]interface{}.
  • Get查询单条记录。
  • Find查询多条记录。
  • Count获取记录条数。
  • IterateRows根据条件遍历数据。
// 查询
results, _ := engine.Query("select * from user")
fmt.Println(results)
results1, _ := engine.QueryString("select * from user")
fmt.Println(results1)
results2, _ := engine.QueryInterface("select * from user")
fmt.Println(results2)

// Get
user := User{}
engine.Get(&user)
fmt.Println(user)
// 指定条件
user1 := User{Name: "root"}
user2 := User{}
engine.Where("name=?", user1.Name).Desc("id").Get(&user2)
fmt.Println(user2)
// 获取指定字段
var name string
engine.Table(&user).Where("id=?", 10002).Cols("name").Get(&name)
fmt.Println(name)

// Find
var users []User
engine.Where("passwd=? and age = ?", "123456", 18).Limit(10, 0).Find(&users)
fmt.Println(users)

// Count
user3 := User{Passwd: "123456", Age: 18}
count, _ := engine.Count(&user3)
fmt.Println(count)

// Iterate Rows
engine.Iterate(&User{Passwd: "123456"}, func(idx int, bean interface{}) error {
  user := bean.(*User)
  fmt.Println(user)
  return nil
})
rows, _ := engine.Rows(&User{Passwd: "123456"})
defer rows.Close()
user4 := User{}
for rows.Next() {
  rows.Scan(&user4)
  fmt.Println(user4)
}

事务

// 事务
session := engine.NewSession()
defer session.Close()

// 开启事务
session.Begin()
defer func() {
   err := recover()
   if nil != err {
      // 回滚
      fmt.Println(err)
      session.Rollback()
   } else {
      session.Commit()
   }
}()

user1 := User{Id: 10007, Name: "root", Age: 18, Passwd: "123456"}
if _, err := session.Insert(&user1); nil != err {
   panic(err)
}

user2 := User{Name: "root111", Age: 32}
session.Where("id=?", 1000).Update(&user2)
if _, err := session.Insert(&user2); nil != err {
   panic(err)
}

if _, err := session.Exec("delete from user where name = ?", "root1"); nil != err {
   panic(err)
}
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""