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

特点:

通过连写操作,可以通过很少的语句完成数据库操作。

支持缓存,事务,乐观锁,多种数据库支持,反转等等特性。

官网:https://xorm.io/zh/

文档:https://xorm.io/zh/docs/

安装:

go get xorm.io/xorm   	# 安装xorm
go get xorm.io/builder	# 安装builde
go get xorm.io/reverse	# 安装模型生成工具

Builder:

Builder 是一个 XORM 内置的轻量级快速 SQL 构建引擎。

请注意此包为独立安装,请确保你的 Go 版本在 1.8+ 以上可以如下安装。

Reverse 工具 :

reverse 是一个用于进行数据库反转的工具,这是一个独立的工程,见 https://gitea.com/xorm/reverse

支持的数据库引擎及对应驱动:

Mysql: github.com/go-sql-driver/mysql
MyMysql: github.com/ziutek/mymysql/godrv
Tidb: github.com/pingcap/tidb
Postgres: github.com/lib/pq
Postgres: github.com/jackc/pgx
SQLite: github.com/mattn/go-sqlite3
SQLite(Pure Go): modernc.org/sqlite
MsSql: github.com/denisenkom/go-mssqldb
Dameng: gitee.com/travelliu/dm
Oracle: github.com/godror/godror
Oracle: github.com/mattn/go-oci8

开始:

创建 Engine:

sqlite3:
package main

import (
	"fmt"
	_ "github.com/mattn/go-sqlite3"
	"xorm.io/xorm"
)

func main() {

	engine, err := xorm.NewEngine("sqlite3", "./test.db")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(engine)
}

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

var engine *xorm.Engine

func main() {
    var err error
    engine, err = xorm.NewEngine("mysql", "root:123@/test?charset=utf8")
}

定义结构体:

type User struct {
	Id      int64 `xorm:"pk autoincr"`		// 主键 自增
	Name    string
	Salt    string
	Age     int
	Passwd  string    `xorm:"varchar(200)"`		// varchar 类型 长度200
	Created time.Time `xorm:"created"`
	Updated time.Time `xorm:"updated"`
}
字段定义及数据类型可参考: Go语言学习笔记—XORM支持数据类型和字段附加属性

同步:

将结构体同步到数据表

func Sync(engine *xorm.Engine) { // 同步结构体到数据库
	err := engine.Sync(new(User))
	if err != nil {
		fmt.Println("同步错误:", err)
	}
}

插入一条或多条数据:

func InsertData(engine *xorm.Engine) {
	root := User{
		Name:    "root",
		Salt:    "030399",
		Age:     0,
		Passwd:  "123456",
		Created: time.Time{},
		Updated: time.Time{},
	}
	mek := User{
		Name:    "mek",
		Salt:    "ABC",
		Age:     26,
		Passwd:  "030399",
		Created: time.Time{},
		Updated: time.Time{},
	}
	gho := User{
		Name:    "ghost",
		Salt:    "ABC",
		Age:     99,
		Passwd:  "000000",
		Created: time.Time{},
		Updated: time.Time{},
	}

	engine.Insert(&root, &mek, &gho)
}

查询数据:


func Inquire(engine *xorm.Engine)  {
	// 查询单条数据
	var user User
	var users []User
	engine.Get(&user)
	fmt.Println(user)

	// 获取所有数据
	engine.Find(&users)
	fmt.Println(users)

	// 按条件单条查询
	var user2 User
	engine.Where("name=?","mek").Get(&user2)
	fmt.Println(user2)

	// 按条件多条查询
	var users2 []User
	engine.Where("salt=?","ABC").Find(&users2)
	fmt.Println(users2)
	
	
}

多条件查询:

// 使用多个 Where 方法进行条件组合:
var users []User
err := engine.Where("name = ?", "John").Where("age > ?", 20).Find(&users)
if err != nil {
    // handle error
}

// 使用 And 方法进行条件组合:
var users []User
err := engine.Where("name = ?", "John").And("age > ?", 20).Find(&users)
if err != nil {
    // handle error
}

// 使用 Or 方法进行条件组合:异或
var users []User
err := engine.Where("name = ?", "John").Or("name = ?", "Jane").Find(&users)
if err != nil {
    // handle error
}

// 使用 In 方法进行条件组合: 多条件查询
var users []User
err := engine.Where("name IN (?)", []string{"John", "Jane"}).Find(&users)
if err != nil {
    // handle error
}

// 使用 Between 方法进行条件组合: 范围查询
var users []User
err := engine.Where("age BETWEEN ? AND ?", 20, 30).Find(&users)
if err != nil {
    // handle error
}

// 模糊查询
var users []User
err := engine.Where("name LIKE ?", "%ohn%").Find(&users)
if err != nil {
    // handle error
}

// 多条件组合模糊查询
var users []User
err := engine.Where("name IN (?, ?)", "%John%", "%Jane%").Find(&users)
if err != nil {
    // handle error
}

更新数据:

func Update(engine *xorm.Engine) {
	// 使用Update 更新所有记录
	var user User
	engine.Get(&user)
	fmt.Println(user)

	user.Name = "Admin"
	engine.Update(&user)

	var user2 User
	engine.Get(&user2)
	fmt.Println(user2)

	// 按条件更新
	_, err := engine.Where("age > ?", 2).Update(&User{Age: 500})
	if err != nil {
		// handle error
	}

}

删除数据:

func Delete(engine *xorm.Engine) {
	// 删除单条记录或多条
	engine.Delete(&User{Name: "abc"})

	// 按条件删除
	_, err := engine.Where("age < ?", 1).Delete(new(User))
	if err != nil {
		// handle error
	}

}

全部示例代码:

package main

import (
	"fmt"
	_ "github.com/mattn/go-sqlite3"
	"time"
	"xorm.io/xorm"
)

type User struct {
	Id      int64 `xorm:"pk autoincr"`
	Name    string
	Salt    string
	Age     int
	Passwd  string    `xorm:"varchar(200)"`
	Created time.Time `xorm:"created"`
	Updated time.Time `xorm:"updated"`
}

func Sync(engine *xorm.Engine) { // 同步结构体到数据库
	err := engine.Sync(new(User))
	if err != nil {
		fmt.Println("同步错误:", err)
	}
}

func Initdb() (engine *xorm.Engine) { // 构建引擎
	engine, err := xorm.NewEngine("sqlite3", "./test.db")
	if err != nil {
		fmt.Println("创建引擎错误:", err)
		return nil
	} else {
		return engine
	}

}

func InsertData(engine *xorm.Engine) {
	root := User{
		Name:    "root",
		Salt:    "030399",
		Age:     0,
		Passwd:  "123456",
		Created: time.Time{},
		Updated: time.Time{},
	}
	mek := User{
		Name:    "mek",
		Salt:    "ABC",
		Age:     26,
		Passwd:  "030399",
		Created: time.Time{},
		Updated: time.Time{},
	}
	gho := User{
		Name:    "ghost",
		Salt:    "ABC",
		Age:     99,
		Passwd:  "000000",
		Created: time.Time{},
		Updated: time.Time{},
	}

	engine.Insert(&root, &mek, &gho)
}

func Inquire(engine *xorm.Engine) {
	// 查询单条数据
	var user User
	var users []User
	engine.Get(&user)
	fmt.Println(user)

	// 获取所有数据
	engine.Find(&users)
	fmt.Println(users)

	// 按条件单条查询
	var user2 User
	engine.Where("name=?", "mek").Get(&user2)
	fmt.Println(user2)

	// 按条件多条查询
	var users2 []User
	engine.Where("salt=?", "ABC").Find(&users2)
	fmt.Println(users2)

}

func Update(engine *xorm.Engine) {
	// 使用Update 更新所有记录
	var user User
	engine.Get(&user)
	fmt.Println(user)

	user.Name = "Admin"
	engine.Update(&user)

	var user2 User
	engine.Get(&user2)
	fmt.Println(user2)

	// 按条件更新
	_, err := engine.Where("age > ?", 2).Update(&User{Age: 500})
	if err != nil {
		// handle error
	}

}

func Delete(engine *xorm.Engine) {
	// 删除单条记录或多条
	engine.Delete(&User{Name: "abc"})

	// 按条件删除
	_, err := engine.Where("age < ?", 1).Delete(new(User))
	if err != nil {
		// handle error
	}

}

func main() {

	engine := Initdb()
	//Inquire(engine)
	fmt.Println(engine)

}