Support customize gorm field type
This commit is contained in:
		
							parent
							
								
									1490a062db
								
							
						
					
					
						commit
						a954d772d7
					
				| @ -24,6 +24,10 @@ type Config struct { | |||||||
| 	gorm.Dialector | 	gorm.Dialector | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type GormDataTypeInterface interface { | ||||||
|  | 	GormDBDataType(*gorm.DB, *schema.Field) string | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (m Migrator) RunWithValue(value interface{}, fc func(*gorm.Statement) error) error { | func (m Migrator) RunWithValue(value interface{}, fc func(*gorm.Statement) error) error { | ||||||
| 	stmt := &gorm.Statement{DB: m.DB} | 	stmt := &gorm.Statement{DB: m.DB} | ||||||
| 	if m.DB.Statement != nil { | 	if m.DB.Statement != nil { | ||||||
| @ -44,6 +48,13 @@ func (m Migrator) DataTypeOf(field *schema.Field) string { | |||||||
| 		return field.DBDataType | 		return field.DBDataType | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	fieldValue := reflect.New(field.IndirectFieldType) | ||||||
|  | 	if dataTyper, ok := fieldValue.Interface().(GormDataTypeInterface); ok { | ||||||
|  | 		if dataType := dataTyper.GormDBDataType(m.DB, field); dataType != "" { | ||||||
|  | 			return dataType | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return m.Dialector.DataTypeOf(field) | 	return m.Dialector.DataTypeOf(field) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -220,6 +220,10 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if dataTyper, ok := fieldValue.Interface().(GormDataTypeInterface); ok { | ||||||
|  | 		field.DataType = DataType(dataTyper.GormDataType()) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { | 	if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) { | ||||||
| 		if strings.ToUpper(v) == "NANO" { | 		if strings.ToUpper(v) == "NANO" { | ||||||
| 			field.AutoCreateTime = UnixNanosecond | 			field.AutoCreateTime = UnixNanosecond | ||||||
|  | |||||||
							
								
								
									
										23
									
								
								schema/interfaces.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								schema/interfaces.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | |||||||
|  | package schema | ||||||
|  | 
 | ||||||
|  | import "gorm.io/gorm/clause" | ||||||
|  | 
 | ||||||
|  | type GormDataTypeInterface interface { | ||||||
|  | 	GormDataType() string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CreateClausesInterface interface { | ||||||
|  | 	CreateClauses() []clause.Interface | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type QueryClausesInterface interface { | ||||||
|  | 	QueryClauses() []clause.Interface | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type UpdateClausesInterface interface { | ||||||
|  | 	UpdateClauses() []clause.Interface | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DeleteClausesInterface interface { | ||||||
|  | 	DeleteClauses() []clause.Interface | ||||||
|  | } | ||||||
| @ -42,22 +42,6 @@ type Schema struct { | |||||||
| 	cacheStore                *sync.Map | 	cacheStore                *sync.Map | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type CreateClausesInterface interface { |  | ||||||
| 	CreateClauses() []clause.Interface |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type QueryClausesInterface interface { |  | ||||||
| 	QueryClauses() []clause.Interface |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type UpdateClausesInterface interface { |  | ||||||
| 	UpdateClauses() []clause.Interface |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type DeleteClausesInterface interface { |  | ||||||
| 	DeleteClauses() []clause.Interface |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (schema Schema) String() string { | func (schema Schema) String() string { | ||||||
| 	if schema.ModelType.Name() == "" { | 	if schema.ModelType.Name() == "" { | ||||||
| 		return fmt.Sprintf("%v(%v)", schema.Name, schema.Table) | 		return fmt.Sprintf("%v(%v)", schema.Name, schema.Table) | ||||||
|  | |||||||
| @ -17,14 +17,21 @@ for dialect in "${dialects[@]}" ; do | |||||||
| 
 | 
 | ||||||
|     if [ "$GORM_VERBOSE" = "" ] |     if [ "$GORM_VERBOSE" = "" ] | ||||||
|     then |     then | ||||||
|       DEBUG=false GORM_DIALECT=${dialect} go test $race -count=1 ./... |       GORM_DIALECT=${dialect} go test $race -count=1 ./... | ||||||
|       cd tests |       if [ -d tests ] | ||||||
|       DEBUG=false GORM_DIALECT=${dialect} go test $race -count=1 ./... |       then | ||||||
|  |         cd tests | ||||||
|  |         GORM_DIALECT=${dialect} go test $race -count=1 ./... | ||||||
|  |         cd .. | ||||||
|  |       fi | ||||||
|     else |     else | ||||||
|       DEBUG=false GORM_DIALECT=${dialect} go test $race -count=1 -v ./... |       GORM_DIALECT=${dialect} go test $race -count=1 -v ./... | ||||||
|       cd tests |       if [ -d tests ] | ||||||
|       DEBUG=false GORM_DIALECT=${dialect} go test $race -count=1 -v ./... |       then | ||||||
|  |         cd tests | ||||||
|  |         GORM_DIALECT=${dialect} go test $race -count=1 -v ./... | ||||||
|  |         cd .. | ||||||
|  |       fi | ||||||
|     fi |     fi | ||||||
|     cd .. |  | ||||||
|   fi |   fi | ||||||
| done | done | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu