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

  • 查询数据库里的所有表名、字段名

api地址:https://pkg.go.dev/xorm.io/xorm
image
image

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("插入失败")
	}
posted @ 2023-03-24 18:18  弩哥++  阅读(330)  评论(0编辑  收藏  举报