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文件)。

例如,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 go 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"`
}
SELECTINSERTUPDATEDELETE

示例 (更多示例参见 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
}