XORM的使用

提示:go1.18.6 windows/amd64


一、xorm是什么?

xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。
特性:

  • 支持 Struct 和数据库表之间的灵活映射,并支持自动同步
  • 事务支持
  • 同时支持原始SQL语句和ORM操作的混合执行
  • 使用连写来简化调用
  • 支持使用ID, In, Where, Limit, Join, Having, Table, SQL, Cols等函数和结构体等方式作为条件
  • 支持级联加载Struct
  • Schema支持(仅Postgres)
  • 支持缓存
  • 通过 xorm.io/reverse 支持根据数据库自动生成 xorm 结构体
  • 支持记录版本(即乐观锁)
    通过 xorm.io/builder 内置 SQL Builder 支持
  • 上下文缓存支持
  • 支持日志上下文

二、安装XORM

go get -u github.com/go-sql-driver/mysql
go get xorm.io/xorm

三、测试连接MySQL

代码如下(示例):

package main

import (
	"fmt"

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

func main() {
	var err error
	// 连接数据库
	e, err := xorm.NewEngine("mysql", "username:password@tcp(192.168.100.111:3306)/test?charset=utf8")
	if err != nil {
		panic(err)
	}
	// 测试链接
	if err2 := e.Ping(); err2 != nil {
		panic(err2)
	} else {
		fmt.Println("连接成功")
	}
	defer e.Close() //延迟关闭数据库
}

四、XORM操作MySQL初探

1. 创建结构体

代码如下(示例):

type Users struct {
	Id     int       `xorm:"pk"`
	Name   string    `xorm:"varchar(25) notnull unique comment('姓名')"`
	Age    uint8     `xorm:"default 18"`
	Create time.Time `xorm:"created"`
}

2. 创建表

代码如下(示例):

err3 := e.Sync2(new(Users))  // 同步数据库结构
fmt.Printf("err3: %v\n", err3)

在这里插入图片描述

2. 添加数据

代码如下(示例):

user := Users{
	Name: "Tom",
	Age:  18,
}
i, _ := e.Insert(&user)
fmt.Printf("i: %v\n", i)

在这里插入图片描述


五、定义表结构

代码如下(示例):

package main
import (
	"fmt"
	"time"
	_ "github.com/go-sql-driver/mysql"
	"xorm.io/xorm"
	"xorm.io/xorm/names"
)
var engine *xorm.Engine
type Users struct {
	Id     int       `xorm:"pk autoincr"`
	Name   string    `xorm:"varchar(25) notnull unique comment('姓名')"`
	Age    int       `xorm:"default 18"`
	Create time.Time `xorm:"created"`
}
func init() {
	var err error
	// 连接数据库
	engine, err = xorm.NewEngine("mysql", "root:mysql8@tcp(192.168.100.111:3306)/test?charset=utf8")
	if err != nil {
		panic(err)
	}
}
func main() {
	defer engine.Close() //延迟关闭数据库
	// 给表名添加前缀
	tbMapper := names.NewPrefixMapper(names.SnakeMapper{}, "prefix_")
	engine.SetTableMapper(tbMapper)
	// 创建表
	err3 := engine.Sync2(new(Users)) // 同步数据库结构
	fmt.Printf("err3: %v\n", err3)
}

在这里插入图片描述

六、表结构的操作

1. 插入数据

代码如下(示例):

user := Users{
	Id:   1,
	Name: "Tom",
	Age:  14,
}
engine.Insert(&user)
fmt.Printf("user.Id: %v\n", user.Id)

2. 查询数据

代码如下(单条数据查询示例):

func SelectData() {
	user := Users{}
	// Alias 别名  Get单条查询
	engine.Alias("ua").Where("ua.id=1").And("ua.name='Tom'").Get(&user)
	fmt.Fprintf(os.Stdout, "姓名:%s, 年龄:%d", user.Name, user.Age)
}

代码如下(多条数据查询示例):

func SelectData() {
	users := make([]Users, 0)
	// Find多条查询
	engine.Asc("id").Find(&users) // Asc正序  Desc 倒序
	fmt.Printf("users: %v\n", users)
}

更多查询方法可查阅xorm的官方文档

3. 修改数据

代码如下(示例):

func UpdateData() {
	user := User{}
	user.Name = "JuLi"
	engine.ID(1).Update(&user)
	fmt.Printf("user: %v\n", user)
}

4. 删除数据

代码如下(示例):

func DeleteData() {
	user := new(User)
	d, _ := engine.ID(1).Delete(user)
	fmt.Printf("d: %v\n", d)
}

软删除

重新创建表结构

代码如下(示例):

type Users struct {
	Id        int       `xorm:"pk autoincr"`
	Name      string    `xorm:"varchar(25) notnull unique comment('姓名')"`
	Age       int       `xorm:"default 18"`
	Create    time.Time `xorm:"created"` // 创建时自动填充时间
	Update    time.Time `xorm:"updated"` // 更新时自动更新时间
	DeletedAt time.Time `xorm:"deleted"` // 软删除
}

在这里插入图片描述

代码如下(软删除示例):

// 与普通的删除方法完全一样
func DeleteData() {
	user := new(Users)
	d, _ := engine.ID(1).Delete(user)
	fmt.Printf("d: %v\n", d)
}

在这里插入图片描述

软删除不会真正的删除数据,而是标记一个删除时间,要真正获得该条记录或真正删除该记录,需要使用Unscoped()

func DeleteData() {
	user := new(Users)
	d, _ := engine.ID(1).Unscoped().Delete(user)
	fmt.Printf("d: %v\n", d)
}

七、完整代码

package main

import (
	"fmt"
	"os"
	"time"

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

var engine *xorm.Engine

type Users struct {
	Id        int       `xorm:"pk autoincr"`
	Name      string    `xorm:"varchar(25) notnull unique comment('姓名')"`
	Age       int       `xorm:"default 18"`
	Create    time.Time `xorm:"created"` // 创建时自动填充时间
	Update    time.Time `xorm:"updated"` // 更新时自动更新时间
	DeletedAt time.Time `xorm:"deleted"` // 软删除
}

func init() {
	var err error
	// 连接数据库
	engine, err = xorm.NewEngine("mysql", "root:mysql8@tcp(192.168.100.111:3306)/test?charset=utf8")
	if err != nil {
		panic(err)
	}
}

// 创建表
func CreateTable() {
	engine.Sync2(new(Users)) // 同步数据库结构
}

// 插入数据
func InsertData() {
	user := Users{
		Name: "Jack",
		Age:  15,
	}
	engine.Insert(&user)
	fmt.Printf("user.Id: %v\n", user.Id)
}

// 查询数据
func SelectData() {
	user := Users{}
	engine.Alias("ua").Where("ua.id=1").And("ua.name='Tom'").Get(&user)
	fmt.Fprintf(os.Stdout, "姓名:%s, 年龄:%d", user.Name, user.Age)
	// users := make([]Users, 0)
	// engine.Asc("id").Find(&users) // Asc正序  Desc 倒序
	// fmt.Printf("users: %v\n", users)
	// 获取标记删除的记录
}

// 更新数据
func UpdateData() {
	user := Users{}
	user.Name = "JuLi"
	engine.ID(1).Update(&user)
	fmt.Printf("user: %v\n", user)
}

// 删除数据
func DeleteData() {
	user := new(Users)
	d, _ := engine.ID(1).Unscoped().Delete(user)
	fmt.Printf("d: %v\n", d)
}
func main() {
	engine.ShowSQL() // 显示SQL语句
	// CreateTable()
	// InsertData()
	// SelectData()
	// UpdateData()
	DeleteData()
	defer engine.Close() //延迟关闭数据库
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值