Merge 5597f7eb10c42304faf5ce5c8aba791ffc2cdc56 into 9acaa33324bbcc78239a1c913d4f1292c12177b9
This commit is contained in:
commit
d83119dc16
@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
@ -94,10 +95,18 @@ func (s *mysql) DataTypeOf(field *StructField) string {
|
|||||||
}
|
}
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
if _, ok := dataValue.Interface().(time.Time); ok {
|
if _, ok := dataValue.Interface().(time.Time); ok {
|
||||||
if _, ok := field.TagSettings["NOT NULL"]; ok {
|
if num, ok := field.TagSettings["FRAC"]; ok {
|
||||||
sqlType = "timestamp"
|
frac, err := strconv.Atoi(num)
|
||||||
|
if err != nil || frac < 0 {
|
||||||
|
frac = 0
|
||||||
|
}
|
||||||
|
if frac > 6 {
|
||||||
|
frac = 6
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlType = fmt.Sprintf("timestamp(%d)", frac)
|
||||||
} else {
|
} else {
|
||||||
sqlType = "timestamp NULL"
|
sqlType = "timestamp"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -432,3 +432,66 @@ func TestMultipleIndexes(t *testing.T) {
|
|||||||
t.Error("MultipleIndexes unique index failed")
|
t.Error("MultipleIndexes unique index failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FractionalSeconds struct {
|
||||||
|
Id int
|
||||||
|
NoFractional time.Time
|
||||||
|
MillisecFractional time.Time `sql:"frac:3"`
|
||||||
|
MicrosecFractional *time.Time `sql:"frac:6;not null"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFractionalSeconds(t *testing.T) {
|
||||||
|
if err := DB.DropTableIfExists(&FractionalSeconds{}).Error; err != nil {
|
||||||
|
fmt.Printf("Failed to delete table fractional_seconds: %+v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.AutoMigrate(&FractionalSeconds{}).Error; err != nil {
|
||||||
|
t.Error("Auto Migrating FractionalSeconds should not raise any error.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
testTime := time.Date(2017, 1, 9, 10, 12, 23, 123456789, time.UTC)
|
||||||
|
|
||||||
|
record := FractionalSeconds{
|
||||||
|
Id: 123,
|
||||||
|
NoFractional: testTime,
|
||||||
|
MillisecFractional: testTime,
|
||||||
|
MicrosecFractional: &testTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.Save(&record).Error; err != nil {
|
||||||
|
t.Error("Saving FractionalSeconds should not raise any error.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
retrieve := FractionalSeconds{}
|
||||||
|
if err := DB.First(&retrieve).Error; err != nil {
|
||||||
|
t.Error("Retrieving FractionalSeconds should not raise any error.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if retrieve.NoFractional.Nanosecond() != 0 {
|
||||||
|
t.Error("NoFractional column value is incorrect.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if retrieve.MillisecFractional.Nanosecond() != 123000000 {
|
||||||
|
t.Error("MillisecFractional column value is incorrect.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if retrieve.MicrosecFractional.Nanosecond() != 123456000 {
|
||||||
|
t.Error("MicrosecFractional column value is incorrect.")
|
||||||
|
}
|
||||||
|
|
||||||
|
record = FractionalSeconds{
|
||||||
|
Id: 456,
|
||||||
|
NoFractional: testTime,
|
||||||
|
MillisecFractional: testTime,
|
||||||
|
MicrosecFractional: nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := DB.Save(&record).Error; err == nil {
|
||||||
|
t.Error("Saving FractionalSeconds should raise error when not null column is null.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user