Go 每日一库之 xorm

简介

Go 标准库提供的数据库接口database/sql比较底层,使用它来操作数据库非常繁琐,而且容易出错。因而社区开源了不少第三方库,如上一篇文章中的sqlc工具,还有各式各样的 ORM (Object Relational Mapping,对象关系映射库),如gormxorm。本文介绍xormxorm是一个简单但强大的 Go 语言 ORM 库,使用它可以大大简化我们的数据库操作。

快速使用

先安装:

$ go get xorm.io/xorm

由于需要操作具体的数据库(本文中我们使用 MySQL),需要安装对应的驱动:

$ go get github.com/go-sql-driver/mysql

使用:

package main

import (
  "log"
  "time"

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

type User struct {
  Id      int64
  Name    string
  Salt    string
  Age     int
  Passwd  string    `xorm:"varchar(200)"`
  Created time.Time `xorm:"created"`
  Updated time.Time `xorm:"updated"`
}

func main() {
  engine, err := xorm.NewEngine("mysql", "root:12345@/test?charset=utf8")

  if err != nil {
    log.Fatal(err)
  }

  err = engine.Sync2(new(User))
  if err != nil {
    log.Fatal(err)
  }
}

使用xorm来操作数据库,首先需要使用xorm.NewEngine()创建一个引擎。该方法的参数与sql.Open()参数相同。

上面代码中,我们演示了xorm的一个非常实用的功能,将数据库中的表与对应 Go 代码中的结构体做同步。初始状态下,数据库test中没有表user,调用Sync2()方法会根据User的结构自动创建一个user表。执行后,通过describe user查看表结构:

如果表user已经存在,Sync()方法会对比User结构与表结构的不同,对表做相应的修改。我们给User结构添加一个Level字段:

type User struct {
  Id      int64
  Name    string
  Salt    string
  Age     int
  Level   int
  Passwd  string    `xorm:"varchar(200)"`
  Created time.Time `xorm:"created"`
  Updated time.Time `xorm:"updated"`
}

再次执行这个程序后,用describe user命令查看表结构:

发现表中多了一个level字段。

**此修改只限于添加字段。**删除表中已有的字段会带来比较大的风险。如果我们User结构的Salt字段删除,然后执行程序。出现下面错误:

[xorm] [warn]  2020/05/07 22:44:38.528784 Table user has column salt but struct has not related field

数据库操作

查询&统计

xorm提供了几个查询和统计方法,Get/Exist/Find/Iterate/Count/Rows/Sum。下面逐一介绍。

为了代码演示方便,我在user表中插入了一些数据:

后面的代码为了简单起见,忽略了错误处理,实际使用中不要漏掉!

Get

Get()方法用于查询单条数据,并使用返回的字段为传入的对象赋值:

type User struct {
  Id      int64
  Name    string
  Salt    string
  Age     int
  Passwd  string    `xorm:"varchar(200)"`
  Created time.Time `xorm:"created"`
  Updated time.Time `xorm:"updated"`
}

func main() {
  engine, _ := xorm.NewEngine("mysql", "root:12345@/test?charset=utf8")

  user1 := &User{}
  h
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值