290112011 发表于 2018-9-20 13:27:37

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

  数据库操作的情况下,我们期望在Golang中创建一个结构体(Struct)与数据库(DB)中的一个表(Table)建立一个映射关系(Mapper),之后我们就通过操作这个Struct来操作DB中对应的Table,无须Hard-Coded sql string,无须手动维护字段映射关系。
  "database/sql"只提供了最基础的操作接口,对数据库中一张表的增删改查等操作,必须手动编写sql string,
  通常都是一个写死的字符串(Hard-Code),并且需要手动维护sql中字段与Golang中的变量的映射关系,这扩展性很差,且非常容易出错。
  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)  
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
  
}
  



页: [1]
查看完整版本: Golang中Struct与DB中表字段通过反射自动映射 - sqlmapper