Searching...

[TOC]

基本介绍

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

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

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

数据结构

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

type Map         map[string]interface{} // 数据记录
type List        []Map                  // 数据记录列表

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

类型转换

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

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

示例1,基本使用

首先,数据表定义如下:

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

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

id   title     price
1    IPhoneX   5999.99

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

package main

import (
    "fmt"
    "gitee.com/johng/gf/g"
    "gitee.com/johng/gf/g/os/glog"
)

func main() {
	g.Config().SetPath("/home/john/Workspace/gitee.com/johng/gf/geg/frame")
    db := g.Database()
    if r, err := db.Table("goods").Where("id=?", 1).One(); err == nil {
        fmt.Printf("goods    id: %d\n",   r["id"].Int())
        fmt.Printf("goods title: %s\n",   r["title"].String())
        fmt.Printf("goods proce: %.2f\n", r["price"].Float32())
    } else {
        glog.Error(err)
    }
}

执行后,输出结果为:

goods    id: 1
goods title: IPhoneX
goods proce: 5999.99

使用g.Database/g.DBgdb.New的区别

获取数据库操作对象有两种方式,一种是使用g.Database/g.DB方法,一种是使用原生gdb.New方法,而前面一种是推荐的使用方式。这两种方式的区别如下: 1. 使用g.*对象管理方式获取的是单例对象,而gdb.New是创建一个新的数据库对象(往往需要自行进行单例管理); 1. 使用g.*整合了配置文件的管理对接(支持配置文件热更新),而gdb.New无法使用配置文件,必须开发者自行解析随后调用gdb的配置管理方法进行配置; 1. 其他使用无差别;