Go Xorm简单使用
官网相关文档
https://xorm.io/zh/docs/chapter-01/1.engine/
https://gitea.com/xorm/xorm/src/branch/master/README_CN.md
xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便
安装
go get xorm.io/xorm
特性:
- 支持 Struct 和数据库表之间的灵活映射,并支持自动同步
- 事务支持
- 同时支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用
- 支持使用ID, In, Where, Limit, Join, Having, Table, SQL, Cols等函数和结构体等方式作为条件
- 支持级联加载Struct
- Schema支持(仅Postgres)
- 支持缓存
- 通过 xorm.io/reverse 支持根据数据库自动生成 xorm 结构体
- 支持记录版本(即乐观锁)
- 通过 xorm.io/builder 内置 SQL Builder 支持
- 上下文缓存支持
- 支持日志上下文
使用
- 封装一个连接mysql的函数
package util
import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"xorm.io/xorm"
"xorm.io/xorm/names"
)
var Engine *xorm.Engine
var (
host = "127.0.0.1"
port = "3306"
username = "root"
pasword = "111111"
defaultCode = "charset=utf8"
dbName = "test"
)
func InitMysql() error {
var err error
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", username, pasword, host, port, dbName, defaultCode)
Engine, err = xorm.NewEngine("mysql", dsn)
if err != nil {
fmt.Println(err)
return err
}
err = Engine.Ping()
if err != nil {
fmt.Println(err)
return err
}
fmt.Println("connect success")
Engine.SetMapper(names.SameMapper{}) //设置表字段名与结构体字段名一致,默认的是SnakeMapper
return nil
}
- 其他地方就可以调用
package main
import (
"basicProject/util"
"fmt"
)
type Goods struct {
Id int
Name string
CreateTime string
UpdateTime string
}
func main() {
err := util.InitMysql()
if err != nil {
fmt.Println("connect fail")
}
err = util.Engine.Sync(new(Goods)) //同步,把结构体同步到数据库里,生成对应的表和字段
//同步后如果结构体又增加了字段,再次编译运行后就会自动同步新的字段到数据表里
if err != nil {
fmt.Println(err)
return
}
}
- 查询数据库里的所有表名、字段名
func main() {
err := utils.InitMysql()
if err != nil {
fmt.Println("connect fail")
}
metas, err := utils.Engine.DBMetas()
if err != nil {
return
}
for i := 0; i < len(metas); i++ { //metas返回的是所有表的信息的切片
fmt.Println(metas[i].Name) //打印表的名称
for j := 0; j < len(metas[i].Columns()); j++ { //metas[i].Columns() 对应表有多少的字段
fmt.Println(metas[i].Columns()[j].Name) //分别打印字段名称
}
}
}
事物注意事项
session := utils.Engine.NewSession() //定义一个会话
defer session.Close()
//开启事物
err = session.Begin()
if err != nil {
fmt.Println("开启动事物失败")
}
s12 := student{Name: "舒克"}
s13 := student{Name: "贝塔"}
defer func() {
err := recover()
if err != nil {
fmt.Println(err)
fmt.Println("开始rollback")
session.Rollback()
} else {
session.Commit()
}
}()
affect, _ := session.ID(1).Update(&s12)
if affect != 1 {
panic("没有更新成功!!!!!!!!!!")
}
//注意,更新、插入的时候一定要使用session.Insert/ion.Update
affect, _ = session.ID(6).Update(&s13)
if affect != 1 {
panic("没有更新成功!!!!!!!!!!")
}
s14 := student{Id: 6, Name: "HUAHUA"}
_, err = session.Insert(&s14)
if err != nil {
panic("插入失败")
}
本文来自博客园,作者:弩哥++,转载请注明原文链接:https://www.cnblogs.com/bangbangzoutianya/p/17252998.html