Golang之xorm基本使用

1,169 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

xorm是golang的orm框架,可以将表与struct一一对应,通过struct即可实现对数据库的操作;同时,相比于gorm相比,xorm具有更早的发行日期,更为齐全的数据库支持,目前支持的数据库有mysql、postgres、tidb、sqlite3、sqlite、mssql、oracle、cockroach,本文主要从以下几个方面介绍如何使用xorm。

  • xorm 安装

  • 数据的CRUD

  • 如何在xorm中使用事务

  • 如何显示执行的SQL

官方文档:xorm.io/zh/docs/

xorm 模块安装

(PS:本文主要使用mysql数据库进行测试)

# 安装 xorm
go get xorm.io/xorm

# 安装 mysql 驱动
go get github.com/go-sql-driver/mysql

数据的CRUD

定义一个user表,具有 username、password、sex 三个字段

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) DEFAULT NULL COMMENT '名称',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `sex` tinyint(1) DEFAULT '0' COMMENT '性别【0-男,1-女】',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

获取数据库连接

xorm中将数据库连接后的对象统一封装到了*xorm.Engine中,所以,我们只需要通过NewEngine()函数拿到Engine对象,即可实现对数据库的操作:

var engine *xorm.Engine
var err error
engine, err = xorm.NewEngine("mysql", "用户名:密码@tcp(数据库地址:数据库端口)/数据库?charset=utf8")

定义struct

新建一个和user表对应的struct

type User struct {
   Id int `xorm:"pk"`
   Username string
   Password string
   Sex int8
}

查询数据

使用Find()方法可以查询多条记录,如果仅需要查询一条数据可以使用Get()方法

users := make([]*User, 0)
err = engine.Where("username LIKE ? ", "%1%").Find(&users)
if err != nil {
   log.Fatal(err)
}
for _, v := range users {
   fmt.Printf("%v", v)
}

新增数据

使用Insert()方法可插入一个表的多条数据或多个表的多条数据;针对多个表时,只需要插入多个表对应的struct数据即可,例如Insert(&users, &orders)

user := User{
   Username: "get",
   Password: "123456",
}
rowNumber, err := engine.Insert(&user) // rowNumber 受影响的行数
if err != nil {
   log.Fatal(err)
}
fmt.Println("RowNumber ==> ", rowNumber)

修改数据

通过Update() 方法可实现数据的修改,当传入参数的是结构体时,针对数据结构默认值不会进行修改,用咱么目前的结构体举例:如果用户的sex传入的为0将无法修改成功,这个时候如果任然需要修改可以考虑使用map来封装需要修改的参数或者使用Cols()方法选中必须更新的字段。在更新的时候还提供了ID()方法,可以直接筛选出id=xx的数据进行更新。

user := User{
   Username: "get2",
}
if _, err := engine.Where("username = 'get'").Update(&user); err != nil {
   log.Fatal(err)
}

删除数据

使用Delete()方法进行数据的删除

rowNumber, err := engine.ID(10).Delete(new(User)) // 删除ID为10的数据
if err != nil {
   log.Fatal(err)
}
fmt.Println("RowNumber ==> ", rowNumber)

如何在xorm中使用事务

xorm中使用 *xorm.Session进行事务相关操作,首先使用NewSession()方法获取Session结构体,然后通过session.Begin()开启事务,使用session.Commit()提交事务,执行完成后使用session.Close()关闭session对象。

session := engine.NewSession()
defer session.Close()
// 开启事务
if err := session.Begin(); err != nil {
   log.Fatal(err)
}
// 插入User
if _, err = session.Insert(User{
   Username: "get3",
}); err != nil {
   log.Fatal(err)
}
// 更新User
if _, err = session.Where("id != '1'").Update(User{
   Username: "get_X",
}); err != nil {
   log.Fatal(err)
}
// 提交事务
session.Commit()

如何显示执行的SQL

engine结构体被定义出来后,可以通过ShowSQL(true)的方式,指定显示执行的SQL语句

engine.ShowSQL(true)