基本介绍

gf框架的ORM模块由gdb模块实现(API文档),最大的特色在于底层默认使用了map作为基础的数据表记录载体,而不是使用struct,开发者无需预先定义数据表记录struct便可直接对数据表记录执行各种操作。这样的设计赋予了开发者更高的灵活度和简便性,并且由于没有使用反射特性,使得执行性能更加高效(当然ORM也支持数据表记录struct的映射转换,详细介绍请查看后续【ORM高级特性】章节)。

gdb数据库引擎底层采用了链接池设计,当链接不再使用时会自动关闭,因此链接对象不用的时候不需要显示使用Close方法关闭数据库连接(并且gdb也没有提供Close方法)。这也是gdb数据库模块人性化设计的地方,方便开发者使用数据库而无需手动维护大量的数据库链接对象。

注意:为提高数据库操作安全性,在ORM操作中不建议直接将参数拼接成SQL执行,又或者将参数拼接称字符串执行,建议尽量使用预处理的方式(充分使用?占位符)来传递SQL参数。

数据结构

为便于数据表记录的操作,ORM定义了5种基本的数据类型:

  1. type Map map[string]interface{} // 数据记录
  2. type List []Map // 数据记录列表
  3. type Value []byte // 返回数据表记录值
  4. type Record map[string]Value // 返回数据表记录键值对
  5. type Result []Record // 返回数据表记录列表
  1. MapList用于ORM操作过程中的输入参数类型(与全局类型g.Mapg.List一致,在项目开发中常用g.Mapg.List替换);
  2. Value/Record/Result用于ORM操作的结果数据类型,其中Result表示数据表记录列表,Record表示一条数据表记录,Value表示记录中的一条键值数据;

类型转换

gf-orm的数据记录结果(Value)支持非常灵活的类型转换,并内置支持常用的数十种数据类型的转换。Result/Record的类型转换请查看后续【ORM高级特性】章节。

Value类型是*gvar.Var类型的别名,因此可以使用gvar.Var数据类型的所有转换方法,具体请查看【通用动态变量】章节

示例1,基本使用

首先,数据表定义如下:

  1. # 商品表
  2. CREATE TABLE `goods` (
  3. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  4. `title` varchar(300) NOT NULL COMMENT '商品名称',
  5. `price` decimal(10,2) NOT NULL COMMENT '商品价格',
  6. ...
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

其次,数据表中的数据如下:

  1. id title price
  2. 1 IPhoneX 5999.99

最后,完整的示例程序如下:

  1. package main
  2. import (
  3. "fmt"
  4. "gitee.com/johng/gf/g"
  5. "gitee.com/johng/gf/g/os/glog"
  6. )
  7. func main() {
  8. g.Config().SetPath("/home/john/Workspace/gitee.com/johng/gf/geg/frame")
  9. db := g.Database()
  10. if r, err := db.Table("goods").Where("id=?", 1).One(); err == nil {
  11. fmt.Printf("goods id: %d\n", r["id"].Int())
  12. fmt.Printf("goods title: %s\n", r["title"].String())
  13. fmt.Printf("goods proce: %.2f\n", r["price"].Float32())
  14. } else {
  15. glog.Error(err)
  16. }
  17. }

执行后,输出结果为:

  1. goods id: 1
  2. goods title: IPhoneX
  3. goods proce: 5999.99