forked from mirror/gorm
Generate more friendly names for table and columns
This commit is contained in:
parent
5c57885d98
commit
f70de0bdff
42
utils.go
42
utils.go
|
@ -41,21 +41,49 @@ func newSafeMap() *safeMap {
|
||||||
|
|
||||||
var smap = newSafeMap()
|
var smap = newSafeMap()
|
||||||
|
|
||||||
|
type Case bool
|
||||||
|
|
||||||
|
const (
|
||||||
|
lower Case = false
|
||||||
|
upper Case = true
|
||||||
|
)
|
||||||
|
|
||||||
func ToDBName(name string) string {
|
func ToDBName(name string) string {
|
||||||
if v := smap.Get(name); v != "" {
|
if v := smap.Get(name); v != "" {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
value := commonInitialismsReplacer.Replace(name)
|
var (
|
||||||
buf := bytes.NewBufferString("")
|
value = commonInitialismsReplacer.Replace(name)
|
||||||
for i, v := range value {
|
buf = bytes.NewBufferString("")
|
||||||
if i > 0 && v >= 'A' && v <= 'Z' {
|
lastCase, currCase, nextCase Case
|
||||||
buf.WriteRune('_')
|
)
|
||||||
|
|
||||||
|
for i, v := range value[:len(value)-1] {
|
||||||
|
nextCase = value[i+1] >= 'A' && value[i+1] <= 'Z'
|
||||||
|
if i > 0 {
|
||||||
|
if currCase == upper {
|
||||||
|
if lastCase == upper && nextCase == upper {
|
||||||
|
buf.WriteRune(v)
|
||||||
|
} else {
|
||||||
|
buf.WriteRune('_')
|
||||||
|
buf.WriteRune(v)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf.WriteRune(v)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currCase = upper
|
||||||
|
buf.WriteRune(v)
|
||||||
}
|
}
|
||||||
buf.WriteRune(v)
|
lastCase = currCase
|
||||||
|
currCase = nextCase
|
||||||
}
|
}
|
||||||
|
|
||||||
s := strings.ToLower(buf.String())
|
buf.WriteByte(value[len(value)-1])
|
||||||
|
|
||||||
|
s := strings.Replace(strings.ToLower(buf.String()), "__", "_", -1)
|
||||||
|
|
||||||
smap.Set(name, s)
|
smap.Set(name, s)
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package gorm_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestToDBNameGenerateFriendlyName(t *testing.T) {
|
||||||
|
var maps = map[string]string{
|
||||||
|
"ThisIsATest": "this_is_a_test",
|
||||||
|
"PFAndESI": "pf_and_esi",
|
||||||
|
"AbcAndJkl": "abc_and_jkl",
|
||||||
|
"EmployeeID": "employee_id",
|
||||||
|
"HTTPAndSMTP": "http_and_smtp",
|
||||||
|
"HTTPServerHandlerForURLID": "http_server_handler_for_url_id",
|
||||||
|
"UUID": "uuid",
|
||||||
|
"HTTPURL": "http_url",
|
||||||
|
"HTTP_URL": "http_url",
|
||||||
|
"ThisIsActuallyATestSoWeMayBeAbleToUseThisCodeInGormPackageAlsoIdCanBeUsedAtTheEndAsID": "this_is_actually_a_test_so_we_may_be_able_to_use_this_code_in_gorm_package_also_id_can_be_used_at_the_end_as_id",
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value := range maps {
|
||||||
|
if gorm.ToDBName(key) != value {
|
||||||
|
t.Errorf("%v ToDBName should equal %v, but got %v", key, value, gorm.ToDBName(key))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue