Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper

Golang中操作数据库已经有现成的库"database/sql"可以用,但是"database/sql"只提供了最基础的操作接口;

对数据库中一张表的增删改查等操作,必须手动编写sql string,这通常都是一个写死的字符串(Hard-Code),

并且需要手动维护sql中字段与Golang中的变量的映射关系,这扩展性很差,且非常容易出错。

通常情况下,我们期望Golang中存在一个Struct与DB中的一个Table建立一个映射关系(Mapper),

之后我们就通过操作这个Struct来操作DB中对应的Table,无须Hard-Coded sql string,无须手动维护字段映射关系。

sqlmapper 就是这样一个极简的工具库(简单到只有一个go文件)。

原文地址:https://github.com/arthas29/sqlmapper

例如,DB中有一张表,结构如下:

CREATE TABLE `test_table` (
  `field_key` varchar(64) NOT NULL DEFAULT ‘‘,
  `field_one` varchar(64) DEFAULT NULL,
  `field_two` tinyint(1) DEFAULT NULL,
  `field_thr` int(12) DEFAULT NULL,
  `field_fou` float DEFAULT NULL,
  PRIMARY KEY (`field_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在Golang中,创建对应的Struct,如下:

// struct in golang such as:
type DemoRow struct {
    FieldKey string  `sql:"field_key"`
    FieldOne string  `sql:"field_one"`
    FieldTwo bool    `sql:"field_two"`
    FieldThr int64   `sql:"field_thr"`
    FieldFou float64 `sql:"field_fou"`
}

然后,我们就可以通过这个Struct执行 SELECT/INSERT/UPDATE/DELETE 操作,无须硬编码的冗长的sql string;

示例 (更多示例参见 fields_map_test.go):

// select single row
// Query by primary key (field[0])
func QueryByKey(ctx context.Context, tx *sql.Tx, db *sql.DB, fieldKey string) (
    *DemoRow, error) {

    var row DemoRow
    row.FieldKey = fieldKey
    fm, err := NewFieldsMap(table, &row)
    if err != nil {
        return nil, err
    }

    objptr, err := fm.SQLSelectByPriKey(ctx, tx, db)
    if err != nil {
        return nil, err
    }

    return objptr.(*DemoRow), nil
}

原文地址:https://www.cnblogs.com/Muoutsblogs/p/8901707.html

时间: 2024-11-05 13:40:35

Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper的相关文章

golang中struct成员变量的标签(Tag)说明和获取方式

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如: type User struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name"` } 这个小米点里的内容是用来干什么的呢? struct成员变量标签(Tag)说明 要比较详

[转] golang中struct、json、map互相转化

一.Json和struct互换 (1)Json转struct例子: type People struct { Name string `json:"name_title"` Age int `json:"age_size"` } func JsonToStructDemo(){ jsonStr := ` { "name_title": "jqw" "age_size":12 } ` var people P

Golang中 struct{} 和 struct{}{}区别

struct是Go中的关键字,用于定义结构类型.例如: type User struct { Name string Age int } struct {} :表示struct类型 struct {}是一个无元素的结构体类型,通常在没有信息存储时使用.优点是大小为0,不需要内存来存储struct {}类型的值. struct {} {}:表示struct类型的值,该值也是空. struct {} {}是一个复合字面量,它构造了一个struct {}类型的值,该值也是空. 例子 var set m

Go_14:GoLang中 json、map、struct 之间的相互转化

1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母必须为大写.请看下面的例子: package commontest import ( "testing" "encoding/json" ) type Person struct { name string age int } func TestStruct2Json(

golang中接口interface和struct结构类的分析

再golang中,我们要充分理解interface和struct这两种数据类型.为此,我们需要优先理解type的作用. type是golang语言中定义数据类型的唯一关键字.对于type中的匿名成员和指针成员,这里先不讲,重点讲解interface和struct这两种特殊的数据类型. interface和struct也是数据类型,特殊在于interface作为万能的接口类型,而struct作为常用的自定义数据类型的关键字.说到这里相比大家已经明白interface的侧重点在于接口的定义(方法),

Golang 中操作 Mongo Update 的方法

Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更多 个人分类: MongoDBGolang 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010649766/article/details/79385948 MongoDB 中有一种时间格式数据 ISODate,参考如下:  如果在 Golan

golang中锁mutex的实现

golang中的锁是通过CAS原子操作实现的,Mutex结构如下: type Mutex struct { state int32 sema  uint32 } //state表示锁当前状态,每个位都有意义,零值表示未上锁 //sema用做信号量,通过PV操作从等待队列中阻塞/唤醒goroutine,等待锁的goroutine会挂到等待队列中,并且陷入睡眠不被调度,unlock锁时才唤醒.具体在sync/mutex.go Lock函数实现中. 插播一下sema 虽然在Mutex中就是一个整形字段

golang 中的指针

# golang 中的指针 看了一篇[文章](http://blog.51cto.com/steed/2341409),写的很好.这里略微总结下重点: 1. 地址值.unsafe.Pointer.uintptr 的关系 - 地址值 与 unsafe.Pointer 可以互相转换 - uintptr 与 unsafe.Pointer 可以互相转换 - 地址在 与 uintptr 不能互相转换 2. 不可寻址的值 (需要指出的是,不可寻址是强行约定的,多数是因为安全) - 不可变的值不可寻址,包括常

golang中fmt的&#39;占位符&#39;使用

golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf. # 定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 说明 举例 输出 %v 相应值的默认格式. Printf("%v", people) {zhangsan}, %+v 打印结构体时,会添加字段名 Printf("%+v",