关于 sqlx
sqlx 是一款 Golang 数据库操作库,它基于原生库 database/sql
上提供了一组扩展 API,是原生库 API 的超集。
默认情况下,sqlx 在进行结构体解析和 scan 时会获取对应的数据库字段,优先级如下:
- 若 tag 存在 db 标签,根据 tag 获取数据库对应字段名,源码可见 sqlx.go#43。
- 若 tag 不存在 db 标签,将字段名全部小写作为数据库对应字段名,源码可见 sqlx.go#27。
根据 TiDB SQL 开发规范及基本原则 - 对象命名规范 中「命名建议使用具有意义的英文词汇,词汇中间以下划线分隔」的内容,我们需要将第二种情况「全部小写」改为「下划线命名法」。
修改 sqlx 数据库字段生成函数一共需要两步。
- 编写下划线命名法 NameMapper 函数。
- 修改默认 NameMapper 函数。
编写下划线命名法 NameMapper 函数
根据源码,我们可知默认情况下,sqlx 使用的是 strings.ToLower
原生库 strings 的方法进行字段处理,该函数仅有名为 name,类型为 string 的参数。
接下来,我们可以参考 gorm
的源码(gorm 默认情况下使用下划线命名法进行数据库字段生成)提取出 toDBName
函数,详细可见 gorm - schema/naming.go:117。
以下是笔者提出的下划线命名法字段生成函数 toDBName
:
import "strings"
var commonInitialismsReplacer = newCommonInitialismsReplacer()
func newCommonInitialismsReplacer() *strings.Replacer {
// https://github.com/golang/lint/blob/master/lint.go#L770
commonInitialisms := []string{
"API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "LHS", "QPS", "RAM", "RHS", "RPC", "SLA", "SMTP", "SSH", "TLS", "TTL", "UID", "UI", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XSRF", "XSS"}
commonInitialismsForReplacer := make([]string, 0, len(commonInitialisms))
for _, initialism := range commonInitialisms {
commonInitialismsForReplacer = append(commonInitialismsForReplacer, initialism, strings.Title(strings.ToLower(initialism)))
}
replacer := strings.NewReplacer(commonInitialismsForReplacer...)
return replacer
}
func