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)
}