Skip to content

Commit 3f2b1cb

Browse files
authored
feat(database/gdb): add year field type support for ORM operations (#3805)
1 parent ab2c3b0 commit 3f2b1cb

File tree

6 files changed

+108
-25
lines changed

6 files changed

+108
-25
lines changed

.github/workflows/ci-main.yml

+5
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ jobs:
5858
- 6379:6379
5959

6060
# MySQL backend server.
61+
# docker run -d --name mysql \
62+
# -p 3306:3306 \
63+
# -e MYSQL_DATABASE=test \
64+
# -e MYSQL_ROOT_PASSWORD=12345678 \
65+
# loads/mysql:5.7
6166
mysql:
6267
image: loads/mysql:5.7
6368
env:

cmd/gf/internal/cmd/cmd.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func (c cGF) Index(ctx context.Context, in cGFInput) (out *cGFOutput, err error)
5959
answer := "n"
6060
// No argument or option, do installation checks.
6161
if data, isInstalled := service.Install.IsInstalled(); !isInstalled {
62-
mlog.Print("hi, it seams it's the first time you installing gf cli.")
62+
mlog.Print("hi, it seems it's the first time you installing gf cli.")
6363
answer = gcmd.Scanf("do you want to install gf(%s) binary to your system? [y/n]: ", gf.VERSION)
6464
} else if !data.IsSelf {
6565
mlog.Print("hi, you have installed gf cli.")

contrib/drivers/mysql/mysql_z_unit_model_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -4786,3 +4786,35 @@ func Test_Model_FixGdbJoin(t *testing.T) {
47864786
t.Assert(gtest.DataContent(`fix_gdb_join_expect.sql`), sqlSlice[len(sqlSlice)-1])
47874787
})
47884788
}
4789+
4790+
func Test_Model_Year_Date_Time_DateTime_Timestamp(t *testing.T) {
4791+
table := "date_time_example"
4792+
array := gstr.SplitAndTrim(gtest.DataContent(`date_time_example.sql`), ";")
4793+
for _, v := range array {
4794+
if _, err := db.Exec(ctx, v); err != nil {
4795+
gtest.Error(err)
4796+
}
4797+
}
4798+
defer dropTable(table)
4799+
4800+
gtest.C(t, func(t *gtest.T) {
4801+
// insert.
4802+
var now = gtime.Now()
4803+
_, err := db.Model("date_time_example").Insert(g.Map{
4804+
"year": now,
4805+
"date": now,
4806+
"time": now,
4807+
"datetime": now,
4808+
"timestamp": now,
4809+
})
4810+
t.AssertNil(err)
4811+
// select.
4812+
one, err := db.Model("date_time_example").One()
4813+
t.AssertNil(err)
4814+
t.Assert(one["year"].String(), now.Format("Y"))
4815+
t.Assert(one["date"].String(), now.Format("Y-m-d"))
4816+
t.Assert(one["time"].String(), now.Format("H:i:s"))
4817+
t.AssertLT(one["datetime"].GTime().Sub(now).Seconds(), 5)
4818+
t.AssertLT(one["timestamp"].GTime().Sub(now).Seconds(), 5)
4819+
})
4820+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE TABLE `date_time_example` (
2+
`id` int unsigned NOT NULL AUTO_INCREMENT,
3+
`year` year DEFAULT NULL COMMENT 'year',
4+
`date` date DEFAULT NULL COMMENT 'Date',
5+
`time` time DEFAULT NULL COMMENT 'time',
6+
`datetime` datetime DEFAULT NULL COMMENT 'datetime',
7+
`timestamp` timestamp NULL DEFAULT NULL COMMENT 'Timestamp',
8+
PRIMARY KEY (`id`)
9+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

database/gdb/gdb.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -493,10 +493,11 @@ const (
493493
fieldTypeSmallmoney = "smallmoney"
494494
fieldTypeBool = "bool"
495495
fieldTypeBit = "bit"
496-
fieldTypeDate = "date"
497-
fieldTypeTime = "time"
498-
fieldTypeDatetime = "datetime"
499-
fieldTypeTimestamp = "timestamp"
496+
fieldTypeYear = "year" // YYYY
497+
fieldTypeDate = "date" // YYYY-MM-DD
498+
fieldTypeTime = "time" // HH:MM:SS
499+
fieldTypeDatetime = "datetime" // YYYY-MM-DD HH:MM:SS
500+
fieldTypeTimestamp = "timestamp" // YYYYMMDD HHMMSS
500501
fieldTypeTimestampz = "timestamptz"
501502
fieldTypeJson = "json"
502503
fieldTypeJsonb = "jsonb"

database/gdb/gdb_core_structure.go

+56-20
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,19 @@ import (
2828
func (c *Core) GetFieldTypeStr(ctx context.Context, fieldName, table, schema string) string {
2929
field := c.GetFieldType(ctx, fieldName, table, schema)
3030
if field != nil {
31-
return field.Type
31+
// Kinds of data type examples:
32+
// year(4)
33+
// datetime
34+
// varchar(64)
35+
// bigint(20)
36+
// int(10) unsigned
37+
typeName := gstr.StrTillEx(field.Type, "(") // int(10) unsigned -> int
38+
if typeName != "" {
39+
typeName = gstr.Trim(typeName)
40+
} else {
41+
typeName = field.Type
42+
}
43+
return typeName
3244
}
3345
return ""
3446
}
@@ -63,9 +75,10 @@ func (c *Core) ConvertDataForRecord(ctx context.Context, value interface{}, tabl
6375
data = MapOrStructToMapDeep(value, true)
6476
)
6577
for fieldName, fieldValue := range data {
78+
var fieldType = c.GetFieldTypeStr(ctx, fieldName, table, c.GetSchema())
6679
data[fieldName], err = c.db.ConvertValueForField(
6780
ctx,
68-
c.GetFieldTypeStr(ctx, fieldName, table, c.GetSchema()),
81+
fieldType,
6982
fieldValue,
7083
)
7184
if err != nil {
@@ -124,41 +137,63 @@ Default:
124137
case time.Time:
125138
if r.IsZero() {
126139
convertedValue = nil
127-
} else if fieldType == fieldTypeDate {
128-
convertedValue = r.Format("2006-01-02")
129-
} else if fieldType == fieldTypeTime {
130-
convertedValue = r.Format("15:04:05")
140+
} else {
141+
switch fieldType {
142+
case fieldTypeYear:
143+
convertedValue = r.Format("2006")
144+
case fieldTypeDate:
145+
convertedValue = r.Format("2006-01-02")
146+
case fieldTypeTime:
147+
convertedValue = r.Format("15:04:05")
148+
default:
149+
}
131150
}
132151

133152
case *time.Time:
134153
if r == nil {
135154
// Nothing to do.
136-
} else if fieldType == fieldTypeDate {
137-
convertedValue = r.Format("2006-01-02")
138-
} else if fieldType == fieldTypeTime {
139-
convertedValue = r.Format("15:04:05")
155+
} else {
156+
switch fieldType {
157+
case fieldTypeYear:
158+
convertedValue = r.Format("2006")
159+
case fieldTypeDate:
160+
convertedValue = r.Format("2006-01-02")
161+
case fieldTypeTime:
162+
convertedValue = r.Format("15:04:05")
163+
default:
164+
}
140165
}
141166

142167
case gtime.Time:
143168
if r.IsZero() {
144169
convertedValue = nil
145-
} else if fieldType == fieldTypeDate {
146-
convertedValue = r.Layout("2006-01-02")
147-
} else if fieldType == fieldTypeTime {
148-
convertedValue = r.Layout("15:04:05")
149170
} else {
150-
convertedValue = r.Time
171+
switch fieldType {
172+
case fieldTypeYear:
173+
convertedValue = r.Layout("2006")
174+
case fieldTypeDate:
175+
convertedValue = r.Layout("2006-01-02")
176+
case fieldTypeTime:
177+
convertedValue = r.Layout("15:04:05")
178+
default:
179+
convertedValue = r.Time
180+
}
151181
}
152182

153183
case *gtime.Time:
154184
if r.IsZero() {
155185
convertedValue = nil
156-
} else if fieldType == fieldTypeDate {
157-
convertedValue = r.Layout("2006-01-02")
158-
} else if fieldType == fieldTypeTime {
159-
convertedValue = r.Layout("15:04:05")
160186
} else {
161-
convertedValue = r.Time
187+
switch fieldType {
188+
case fieldTypeYear:
189+
convertedValue = r.Layout("2006")
190+
case fieldTypeDate:
191+
convertedValue = r.Layout("2006-01-02")
192+
case fieldTypeTime:
193+
convertedValue = r.Layout("15:04:05")
194+
default:
195+
convertedValue = r.Time
196+
}
162197
}
163198

164199
case Counter, *Counter:
@@ -181,6 +216,7 @@ Default:
181216
}
182217
}
183218
}
219+
default:
184220
}
185221

186222
return convertedValue, nil

0 commit comments

Comments
 (0)