Use Common Initialisms from golint

This commit is contained in:
Jinzhu 2015-02-18 10:19:34 +08:00
parent 672ba4ffc9
commit 5c478b46e1
12 changed files with 66 additions and 54 deletions

View File

@ -39,7 +39,6 @@ db.Save(&User{Name: "xxx"}) // table "users"
* Column name is the snake case of field's name * Column name is the snake case of field's name
* Use `Id` field as primary key * Use `Id` field as primary key
* Use tag `sql` to change field's property, change the tag name with `db.SetTagIdentifier(new_name)`
* Use `CreatedAt` to store record's created time if field exists * Use `CreatedAt` to store record's created time if field exists
* Use `UpdatedAt` to store record's updated time if field exists * Use `UpdatedAt` to store record's updated time if field exists
* Use `DeletedAt` to store record's deleted time if field exists [Soft Delete](#soft-delete) * Use `DeletedAt` to store record's deleted time if field exists [Soft Delete](#soft-delete)

View File

@ -157,7 +157,7 @@ func (association *Association) Count() int {
whereSql := fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(relationship.ForeignDBName)) whereSql := fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(relationship.ForeignDBName))
countScope := scope.db.Model("").Table(newScope.QuotedTableName()).Where(whereSql, association.PrimaryKey) countScope := scope.db.Model("").Table(newScope.QuotedTableName()).Where(whereSql, association.PrimaryKey)
if relationship.ForeignType != "" { if relationship.ForeignType != "" {
countScope = countScope.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(ToDBColumnName(relationship.ForeignType))), scope.TableName()) countScope = countScope.Where(fmt.Sprintf("%v.%v = ?", newScope.QuotedTableName(), newScope.Quote(ToDBName(relationship.ForeignType))), scope.TableName())
} }
countScope.Count(&count) countScope.Count(&count)
} else if relationship.Kind == "belongs_to" { } else if relationship.Kind == "belongs_to" {

View File

@ -65,11 +65,11 @@ func TestRelated(t *testing.T) {
DB.Save(&user) DB.Save(&user)
if user.CreditCard.Id == 0 { if user.CreditCard.ID == 0 {
t.Errorf("After user save, credit card should have id") t.Errorf("After user save, credit card should have id")
} }
if user.BillingAddress.Id == 0 { if user.BillingAddress.ID == 0 {
t.Errorf("After user save, billing address should have id") t.Errorf("After user save, billing address should have id")
} }

View File

@ -26,7 +26,7 @@ func Create(scope *Scope) {
var sqls, columns []string var sqls, columns []string
for _, field := range scope.Fields() { for _, field := range scope.Fields() {
if (field.IsNormal && !field.IsPrimaryKey) || (field.IsPrimaryKey && !field.IsBlank) { if (field.IsNormal && !field.IsPrimaryKey) || (field.IsPrimaryKey && !field.IsBlank) {
if !field.IsBlank || field.DefaultValue == nil { if !field.IsBlank || !field.HasDefaultValue {
columns = append(columns, scope.Quote(field.DBName)) columns = append(columns, scope.Quote(field.DBName))
sqls = append(sqls, scope.AddToVars(field.Field.Interface())) sqls = append(sqls, scope.AddToVars(field.Field.Interface()))
} }

View File

@ -48,7 +48,7 @@ func Update(scope *Scope) {
} else { } else {
for _, field := range scope.Fields() { for _, field := range scope.Fields() {
if !field.IsPrimaryKey && field.IsNormal { if !field.IsPrimaryKey && field.IsNormal {
if !field.IsBlank || field.DefaultValue == nil { if !field.IsBlank || !field.HasDefaultValue {
sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface()))) sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface())))
} }
} }

View File

@ -2,7 +2,7 @@
## Architecture ## Architecture
The most notable component of Gorm is `gorm.DB`, which hold database connection. It could be initialized like this: The most notable component of Gorm is`gorm.DB`, which hold database connection. It could be initialized like this:
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable") db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")

View File

@ -22,14 +22,14 @@ type StructField struct {
Name string Name string
Names []string Names []string
IsPrimaryKey bool IsPrimaryKey bool
IsScanner bool
IsTime bool
IsNormal bool IsNormal bool
IsIgnored bool IsIgnored bool
DefaultValue *string IsScanner bool
HasDefaultValue bool
SqlTag string SqlTag string
Tag reflect.StructTag Tag reflect.StructTag
Struct reflect.StructField Struct reflect.StructField
IsForeignKey bool
Relationship *Relationship Relationship *Relationship
} }
@ -39,14 +39,14 @@ func (structField *StructField) clone() *StructField {
Name: structField.Name, Name: structField.Name,
Names: structField.Names, Names: structField.Names,
IsPrimaryKey: structField.IsPrimaryKey, IsPrimaryKey: structField.IsPrimaryKey,
IsScanner: structField.IsScanner,
IsTime: structField.IsTime,
IsNormal: structField.IsNormal, IsNormal: structField.IsNormal,
IsIgnored: structField.IsIgnored, IsIgnored: structField.IsIgnored,
DefaultValue: structField.DefaultValue, IsScanner: structField.IsScanner,
HasDefaultValue: structField.HasDefaultValue,
SqlTag: structField.SqlTag, SqlTag: structField.SqlTag,
Tag: structField.Tag, Tag: structField.Tag,
Struct: structField.Struct, Struct: structField.Struct,
IsForeignKey: structField.IsForeignKey,
Relationship: structField.Relationship, Relationship: structField.Relationship,
} }
} }
@ -146,7 +146,7 @@ func (scope *Scope) GetModelStruct() *ModelStruct {
} }
} }
} else { } else {
modelStruct.TableName = ToDBColumnName(scopeType.Name()) modelStruct.TableName = ToDBName(scopeType.Name())
if scope.db == nil || !scope.db.parent.singularTable { if scope.db == nil || !scope.db.parent.singularTable {
for index, reg := range pluralMapKeys { for index, reg := range pluralMapKeys {
if reg.MatchString(modelStruct.TableName) { if reg.MatchString(modelStruct.TableName) {
@ -176,14 +176,14 @@ func (scope *Scope) GetModelStruct() *ModelStruct {
modelStruct.PrimaryKeyField = field modelStruct.PrimaryKeyField = field
} }
if value, ok := sqlSettings["DEFAULT"]; ok { if _, ok := sqlSettings["DEFAULT"]; ok {
field.DefaultValue = &value field.HasDefaultValue = true
} }
if value, ok := gormSettings["COLUMN"]; ok { if value, ok := gormSettings["COLUMN"]; ok {
field.DBName = value field.DBName = value
} else { } else {
field.DBName = ToDBColumnName(fieldStruct.Name) field.DBName = ToDBName(fieldStruct.Name)
} }
fieldType, indirectType := fieldStruct.Type, fieldStruct.Type fieldType, indirectType := fieldStruct.Type, fieldStruct.Type
@ -196,7 +196,7 @@ func (scope *Scope) GetModelStruct() *ModelStruct {
} }
if _, isTime := reflect.New(indirectType).Interface().(*time.Time); isTime { if _, isTime := reflect.New(indirectType).Interface().(*time.Time); isTime {
field.IsTime, field.IsNormal = true, true field.IsNormal = true
} }
many2many := gormSettings["MANY2MANY"] many2many := gormSettings["MANY2MANY"]
@ -238,8 +238,8 @@ func (scope *Scope) GetModelStruct() *ModelStruct {
ForeignType: foreignType, ForeignType: foreignType,
ForeignFieldName: foreignKey, ForeignFieldName: foreignKey,
AssociationForeignFieldName: associationForeignKey, AssociationForeignFieldName: associationForeignKey,
ForeignDBName: ToDBColumnName(foreignKey), ForeignDBName: ToDBName(foreignKey),
AssociationForeignDBName: ToDBColumnName(associationForeignKey), AssociationForeignDBName: ToDBName(associationForeignKey),
Kind: kind, Kind: kind,
} }
} else { } else {
@ -274,7 +274,7 @@ func (scope *Scope) GetModelStruct() *ModelStruct {
field.Relationship = &Relationship{ field.Relationship = &Relationship{
ForeignFieldName: foreignKey, ForeignFieldName: foreignKey,
ForeignDBName: ToDBColumnName(foreignKey), ForeignDBName: ToDBName(foreignKey),
ForeignType: foreignType, ForeignType: foreignType,
Kind: kind, Kind: kind,
} }

View File

@ -145,7 +145,7 @@ func (scope *Scope) SetColumn(column interface{}, value interface{}) error {
return field.Set(value) return field.Set(value)
} }
dbName = ToDBColumnName(dbName) dbName = ToDBName(dbName)
if field, ok := scope.Fields()[dbName]; ok { if field, ok := scope.Fields()[dbName]; ok {
return field.Set(value) return field.Set(value)
} }

View File

@ -316,7 +316,7 @@ func (scope *Scope) updatedAttrsWithValues(values map[string]interface{}, ignore
fields := scope.Fields() fields := scope.Fields()
for key, value := range values { for key, value := range values {
if field, ok := fields[ToDBColumnName(key)]; ok && field.Field.IsValid() { if field, ok := fields[ToDBName(key)]; ok && field.Field.IsValid() {
if !reflect.DeepEqual(field.Field, reflect.ValueOf(value)) { if !reflect.DeepEqual(field.Field, reflect.ValueOf(value)) {
if !equalAsString(field.Field.Interface(), value) { if !equalAsString(field.Field.Interface(), value) {
hasUpdate = true hasUpdate = true
@ -389,8 +389,8 @@ func (scope *Scope) related(value interface{}, foreignKeys ...string) *Scope {
fromFields := scope.Fields() fromFields := scope.Fields()
toFields := toScope.Fields() toFields := toScope.Fields()
for _, foreignKey := range append(foreignKeys, toScope.typeName()+"Id", scope.typeName()+"Id") { for _, foreignKey := range append(foreignKeys, toScope.typeName()+"Id", scope.typeName()+"Id") {
fromField := fromFields[ToDBColumnName(foreignKey)] fromField := fromFields[ToDBName(foreignKey)]
toField := toFields[ToDBColumnName(foreignKey)] toField := toFields[ToDBName(foreignKey)]
if fromField != nil { if fromField != nil {
if relationship := fromField.Relationship; relationship != nil { if relationship := fromField.Relationship; relationship != nil {
@ -411,7 +411,7 @@ func (scope *Scope) related(value interface{}, foreignKeys ...string) *Scope {
sql := fmt.Sprintf("%v = ?", scope.Quote(relationship.ForeignDBName)) sql := fmt.Sprintf("%v = ?", scope.Quote(relationship.ForeignDBName))
query := toScope.db.Where(sql, scope.PrimaryKeyValue()) query := toScope.db.Where(sql, scope.PrimaryKeyValue())
if relationship.ForeignType != "" && toScope.HasColumn(relationship.ForeignType) { if relationship.ForeignType != "" && toScope.HasColumn(relationship.ForeignType) {
query = query.Where(fmt.Sprintf("%v = ?", scope.Quote(ToDBColumnName(relationship.ForeignType))), scope.TableName()) query = query.Where(fmt.Sprintf("%v = ?", scope.Quote(ToDBName(relationship.ForeignType))), scope.TableName())
} }
scope.Err(query.Find(value).Error) scope.Err(query.Find(value).Error)
} }

View File

@ -36,7 +36,7 @@ type User struct {
} }
type CreditCard struct { type CreditCard struct {
Id int8 ID int8
Number string Number string
UserId sql.NullInt64 UserId sql.NullInt64
CreatedAt time.Time CreatedAt time.Time
@ -53,7 +53,7 @@ type Email struct {
} }
type Address struct { type Address struct {
Id int ID int
Address1 string Address1 string
Address2 string Address2 string
Post string Post string

View File

@ -5,15 +5,28 @@ import (
"strings" "strings"
) )
// Copied from golint
var 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", "UI", "UID", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XSRF", "XSS"}
var commonInitialismsReplacer *strings.Replacer
func init() {
var commonInitialismsForReplacer []string
for _, initialism := range commonInitialisms {
commonInitialismsForReplacer = append(commonInitialismsForReplacer, initialism, strings.Title(strings.ToLower(initialism)))
}
commonInitialismsReplacer = strings.NewReplacer(commonInitialismsForReplacer...)
}
var smap = map[string]string{} var smap = map[string]string{}
func ToDBColumnName(u string) string { func ToDBName(name string) string {
if v, ok := smap[u]; ok { if v, ok := smap[name]; ok {
return v return v
} }
value := commonInitialismsReplacer.Replace(name)
buf := bytes.NewBufferString("") buf := bytes.NewBufferString("")
for i, v := range u { for i, v := range value {
if i > 0 && v >= 'A' && v <= 'Z' { if i > 0 && v >= 'A' && v <= 'Z' {
buf.WriteRune('_') buf.WriteRune('_')
} }
@ -21,7 +34,7 @@ func ToDBColumnName(u string) string {
} }
s := strings.ToLower(buf.String()) s := strings.ToLower(buf.String())
smap[u] = s smap[name] = s
return s return s
} }

View File

@ -44,7 +44,7 @@ func convertInterfaceToMap(values interface{}) map[string]interface{} {
switch value := values.(type) { switch value := values.(type) {
case map[string]interface{}: case map[string]interface{}:
for k, v := range value { for k, v := range value {
attrs[ToDBColumnName(k)] = v attrs[ToDBName(k)] = v
} }
case []interface{}: case []interface{}:
for _, v := range value { for _, v := range value {
@ -58,7 +58,7 @@ func convertInterfaceToMap(values interface{}) map[string]interface{} {
switch reflectValue.Kind() { switch reflectValue.Kind() {
case reflect.Map: case reflect.Map:
for _, key := range reflectValue.MapKeys() { for _, key := range reflectValue.MapKeys() {
attrs[ToDBColumnName(key.Interface().(string))] = reflectValue.MapIndex(key).Interface() attrs[ToDBName(key.Interface().(string))] = reflectValue.MapIndex(key).Interface()
} }
default: default:
scope := Scope{Value: values} scope := Scope{Value: values}