Golang Xorm库 1.0 快速上手

本文介绍Xorm,一个使用Go语言编写的ORM库,适用于Mysql、Postgres等数据库,覆盖gitea、grafana等项目。文章深入解析Xorm的基础映射、数据模型、CRUD操作、事务处理及复杂查询,并提供银行交易示例代码。

Xorm简介

Xorm 是使用 Go 语言编写的 ORM 库,支持 Mysql 、Postgres、TiDB 等数据库驱动,在 gitea、grafana 等开源项目中均有应用。

Xorm的 gitea 仓库链接
Xorm的中文文档

Xorm的安装和导入

xorm 旧版本有在 github 上维护过,但是新版本都转移到 gitea 上维护,安装最新版的 xorm 库的命令为:

go get -v xorm.io/xorm

在代码中导入的语句为

import (
    "xorm.io/xorm"
    // 根据需要匿名导入数据库驱动
    _ "github.com/go-sql-driver/mysql"
)
"

如果开启了 go module,在代码文件中导入 xorm 后,可以执行 go mod tidy 自动下载 xorm 库并同步到 go.mod 文件中

基础映射关系

ORM(Object Relational Mapping)的含义就是把代码中的对象映射为数据库(通常时关系型数据库)中的一个表,在 xorm 中基础的代码及数据库的映射关系如下:

// 一个 struct 结构体对应数据库中的一张表
// 结构体中的成员对应数据表中的一个字段
// 结构体成员的标签对应数据表字段的相关属性,如类型、是否允许为空、注释等,如果没有指定标签,则用 xorm 库中规定 Go数据类型及字段类型对应表
type User struct {
    Id   int64
    Name string  `xorm:"varchar(25) notnull unique 'usr_name' comment('姓名')"`
}

// xorm中的一个 Engine 数据类型,对应数据库中的一个库,此例中就是 xorm-demo 库
engine, _ := xorm.NewEngine("mysql", "root:passwd@/xorm-demo?charset=utf8")

// 设置日志显示sql查询语句
engine.ShowSQL(true)

// 根据struct定义在数据库中创建相应的表结构
if err = engine.Sync2(new(User)); err != nil {
	log.Fatalf("Fail to sync database: %v\n", err)
}

数据模型示例

本文以经典的银行交易为例子,演示 xorm 库在操作数据库时的用途。
数据模型为:

type Account struct {
	Id         int64
	Name       string `xorm:"notnull unique"`
	Balance    decimal.Decimal
	CardNumber string    `xorm:"index"`
	Version    int       `xorm:"version"`
	CreatedAt  time.Time `xorm:"created"`
	UpdatedAt  time.Time `xorm:"updated"`
}

type Card struct {
	Number    string `xorm:"pk varchar(25) notnull unique 'card_No' comment('银行卡号')"`
	ValidFrom time.Time
	ValidThru time.Time
}
xorm特殊标签

结构体的成员可以通过xorm的标签来声明一些字段属性,有一些可以“望文生义”,比如 notnull 表示字段不能为空,unique 表示字段的值必须唯一,有一些需要查阅文档,比如 created 代表该字段的值为记录创建的时间,version 表示该字段作为乐观锁,详细情况可以查看文档 Xorm中文文档-Column属性定义

xorm名称映射规则

xorm的默认名称映射规则是把驼峰命名的结构体成员转换为下划线命名的数据库字段,如 CreatedAt 会被映射为 created_at

xorm 中定义了 Mapper 接口,凡是实现了 Mapper 接口方法的结构体都可以作为映射规则,默认的映射规则对应的结构体是 SnakeMapper

映射规则是全局生效的,即所有的表名或所有的字段名都遵从一个映射规则:

// 设置映射规则后,所有表的迁移、查询、插入等操作都会运用该映射规则
	colMapper := names.NewPrefixMapper(names.SnakeMapper{}, "card_")
	engine.SetColumnMapper(colMapper)
	if err = engine.Sync2(new(Card)); err != nil {
		log.Fatalf("Fail to sync database: %v\n", err)
	}

// 同步后的 card 表
mysql> desc card;
+-----------------+-------------+------+-----+---------+-------+
| Field           | Type        | Null | Key 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wonain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值