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][]byte
。QueryString
返回[]map[string]string
,QueryInterface
返回[]map[string]interface{}
.Get
查询单条记录。Find
查询多条记录。Count
获取记录条数。Iterate
和Rows
根据条件遍历数据。
// 查询
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)
}