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
}