这是我参与「第五届青训营 」伴学笔记创作活动的第7天
前言
在一个正常的业务开发中,数据库的连接必不可少,使用一款优秀的数据库框架能帮助我们更有效的开发,这篇文主要记录xorm框架简单使用的学习。
xorm简介
xorm是一款强大的go语言orm库,操作十分简洁。
特性
- 支持Struct和数据库表之间的灵活映射,并支持自动同步
- 事务支持
- 同时支持原始SQL语句和ORM操作的混合执行
- 使用连写来简化调用
- 支持使用Id, In, Where, Limit, Join, Having, Table, SQL, Cols等函数和结构体等方式作为条件
- 支持级联加载Struct
- Schema支持(仅Postgres)
- 支持缓存
- 支持根据数据库自动生成xorm的结构体
- 支持记录版本(即乐观锁)
- 内置SQL Builder支持
- 通过EngineGroup支持读写分离和负载均衡
驱动支持
- Mysql: github.com/go-sql-driv…
- MyMysql: github.com/ziutek/mymy…
- Postgres: github.com/lib/pq
- Tidb: github.com/pingcap/tid…
- SQLite: github.com/mattn/go-sq…
- MsSql: github.com/denisenkom/…
- MsSql: github.com/lunny/godbc
- Oracle: github.com/mattn/go-oc… (试验性支持)
- ql: github.com/cznic/ql (试验性支持)
以上详情均参考自Go语言中文文档-xorm (topgoer.com)和XORM官网,写得比我详细。
xorm的简单使用
与数据库创建连接
//数据库连接基本信息
var (
username string = "username"
password string = "password"
ip string = "localhost"
port int = 3306
dbName string = "数据库名"
charset string = "utf8mb4"//数据库字符集
)
//构建数据库连接信息
dataSourceName := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s", username, password, ip, port, dbName, charset)//这里对数据库连接信息进行拼接
engine, err := xorm.NewEngine("mysql", dataSourceName)//获取连接引擎
以上对数据库连接信息进行拼接后会得到一个url等价于直接写入一个url。在获取连接引擎时,要指定连接数据库类型并传入数据库连接信息的url。这里用的mysql数据库,需要导入mysql的驱动包,否则运行时会报错的。
import (
_"github.com/go-sql-driver/mysql"
)
同步结构体与数据表
很多数据库框架加上一些插件都能实现不写sql而对数据库进行简单操作的,这些功能xorm都支持,而将数据表的实体结构体同步并自动创建表却不是大多数所支持的,这一功能极大的方便我们对于简单表的开发与修改。
在上面我们已经获取到了连接引擎engine,下面就用engine来操作。
type User struct {
id int64
userName string
//这里在反引号里面可以定义一些该变量的属性,如果用的gorm把xorm改为gorm即可,双引号里面是该变量在数据库里面的属性(包括类型、主键等)
password1 string `xorm:"varchar(200)"`
}
//结构体同步到数据库
err =engine.Sync(new(User))//这里如果err为空的话就代表同步成功了,打开数据库会发现多了一张表
数据插入
使用Insert方法插入一个对象,Insert支持插入多条数据(可以一次插入也可以是一个结构体数组),不过需要传入的是该数据的地址。
user :=User{}
n,_:=engine.Table("user").Insert(&user)//该方法会返回数据库里面受到影响的行数。
数据更新
数据更新使用Update(默认更新非空和非零字段),删除使用Dalete(至少需要一个条件,否则会报错),使用Exec执行一条sql语句
//数据更新
user :=User{userName: "萧"}
n,_:=engine.Table("user").ID(4).Update(&user)
//数据删除
n,_:=engine.Table("user").ID(4).Delete()
n,_:=engine.Table("user").Where("id=?",4).Delete()
//Exec
result,_:=engine.Exec("delete from uer where id =?",4)
查询
可以手写sql查询也可以用方法快捷查询
//query
result1,_:=engine.Query("select * from user")
//get,只能查找一条记录
user :=User{}
engine.Get(&user)
//find,可以查询多条记录
var userList []User
engine.Table("user").Where("id=?",1).Desc("user_name").Find(&userList)
小结
xorm自带的很多方法极大的简化了开发,能够实现简单的数据库操作,但方法不是万能的,对于复杂的业务sql还是需要自己手动去实现。
参考
- Go语言中文文档-xorm (topgoer.com)
- 【【狂神说】xorm框架快速上手 | 快速转型GoWeb开发 | Go语言零基础教程-哔哩哔哩】 b23.tv/3cU63V7