Skip to content

Commit 79edf1f

Browse files
committed
fix: gorm tag of multi index
1 parent 1ec6569 commit 79edf1f

File tree

8 files changed

+68
-34
lines changed

8 files changed

+68
-34
lines changed

field/tag.go

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ func (tag Tag) Build() string {
6060
}
6161

6262
tags := make([]string, 0, len(tag))
63-
keys := tagKeySort(tag)
64-
for _, k := range keys {
63+
for _, k := range tagKeys(tag) {
6564
v := tag[k]
6665
if k == "" || v == "" {
6766
continue
@@ -71,10 +70,19 @@ func (tag Tag) Build() string {
7170
return strings.Join(tags, " ")
7271
}
7372

74-
type GormTag Tag
73+
type GormTag map[string][]string
7574

76-
func (tag GormTag) Set(key, value string) GormTag {
77-
tag[key] = value
75+
func (tag GormTag) Append(key string, values ...string) GormTag {
76+
if _, ok := tag[key]; ok {
77+
tag[key] = append(tag[key], values...)
78+
} else {
79+
tag[key] = values
80+
}
81+
return tag
82+
}
83+
84+
func (tag GormTag) Set(key string, values ...string) GormTag {
85+
tag[key] = values
7886
return tag
7987
}
8088

@@ -88,33 +96,59 @@ func (tag GormTag) Build() string {
8896
return ""
8997
}
9098
tags := make([]string, 0, len(tag))
91-
keys := tagKeySort(Tag(tag))
92-
for _, k := range keys {
93-
v := tag[k]
94-
if k == "" && v == "" {
99+
for _, k := range gormKeys(tag) {
100+
vs := tag[k]
101+
if len(vs) == 0 && k == "" {
95102
continue
96103
}
97-
tv := make([]string, 0, 2)
98-
if k != "" {
99-
tv = append(tv, k)
104+
if len(vs) == 0 {
105+
tags = append(tags, k)
106+
continue
100107
}
101-
if v != "" {
102-
tv = append(tv, v)
108+
for _, v := range vs {
109+
if k == "" && v == "" {
110+
continue
111+
}
112+
tv := make([]string, 0, 2)
113+
if k != "" {
114+
tv = append(tv, k)
115+
}
116+
if v != "" {
117+
tv = append(tv, v)
118+
}
119+
tags = append(tags, strings.Join(tv, ":"))
103120
}
104-
tags = append(tags, strings.Join(tv, ":"))
105121
}
106122

107123
return strings.Join(tags, ";")
108124
}
109125

110-
func tagKeySort(tag Tag) []string {
126+
func tagKeys(tag Tag) []string {
127+
keys := make([]string, 0, len(tag))
128+
if len(tag) == 0 {
129+
return keys
130+
}
131+
for k, _ := range tag {
132+
keys = append(keys, k)
133+
}
134+
return keySort(keys)
135+
}
136+
137+
func gormKeys(tag GormTag) []string {
111138
keys := make([]string, 0, len(tag))
112139
if len(tag) == 0 {
113140
return keys
114141
}
115142
for k, _ := range tag {
116143
keys = append(keys, k)
117144
}
145+
return keySort(keys)
146+
}
147+
148+
func keySort(keys []string) []string {
149+
if len(keys) == 0 {
150+
return keys
151+
}
118152
sort.Slice(keys, func(i, j int) bool {
119153
if tagKeyPriorities[keys[i]] == tagKeyPriorities[keys[j]] {
120154
return keys[i] <= keys[j]

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ require (
77
gopkg.in/yaml.v3 v3.0.1
88
gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c
99
gorm.io/driver/clickhouse v0.5.0
10-
gorm.io/driver/mysql v1.4.4
10+
gorm.io/driver/mysql v1.5.1-0.20230509030346-3715c134c25b
1111
gorm.io/driver/postgres v1.4.5
1212
gorm.io/driver/sqlite v1.4.3
1313
gorm.io/driver/sqlserver v1.4.1
14-
gorm.io/gorm v1.24.2
14+
gorm.io/gorm v1.25.1-0.20230505075827-e61b98d69677
1515
gorm.io/hints v1.1.0
1616
gorm.io/plugin/dbresolver v1.3.0
1717
)

go.sum

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ gorm.io/datatypes v1.1.1-0.20230130040222-c43177d3cf8c/go.mod h1:SH2K9R+2RMjuX1C
365365
gorm.io/driver/clickhouse v0.5.0 h1:aT6fJOQ3PLBJ7q0SGPSXgIv/EOoYjOaHJ0e+1MLm7yw=
366366
gorm.io/driver/clickhouse v0.5.0/go.mod h1:cIKAlFw+IVK75g0bDcm0M9qRA4EAgsn23Si+zCXQ1Lc=
367367
gorm.io/driver/mysql v1.3.2/go.mod h1:ChK6AHbHgDCFZyJp0F+BmVGb06PSIoh9uVYKAlRbb2U=
368-
gorm.io/driver/mysql v1.4.4 h1:MX0K9Qvy0Na4o7qSC/YI7XxqUw5KDw01umqgID+svdQ=
369-
gorm.io/driver/mysql v1.4.4/go.mod h1:BCg8cKI+R0j/rZRQxeKis/forqRwRSYOR8OM3Wo6hOM=
368+
gorm.io/driver/mysql v1.5.1-0.20230509030346-3715c134c25b h1:O7DuK4tml7U+sG1NJmGXz3LXaO6Goblps5Gx4NBuxis=
369+
gorm.io/driver/mysql v1.5.1-0.20230509030346-3715c134c25b/go.mod h1:RpAr+f2lUtJUm0e2FAbttXiUKgAqKSUtzI1ulJfz9xU=
370370
gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc=
371371
gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg=
372372
gorm.io/driver/sqlite v1.1.6/go.mod h1:W8LmC/6UvVbHKah0+QOC7Ja66EaZXHwUTjgXY8YNWX8=
@@ -377,12 +377,11 @@ gorm.io/driver/sqlserver v1.4.1/go.mod h1:DJ4P+MeZbc5rvY58PnmN1Lnyvb5gw5NPzGshHD
377377
gorm.io/gorm v1.21.15/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
378378
gorm.io/gorm v1.22.2/go.mod h1:F+OptMscr0P2F2qU97WT1WimdH9GaQPoDW7AYd5i2Y0=
379379
gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
380-
gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
381380
gorm.io/gorm v1.23.10/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
382381
gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
383382
gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
384-
gorm.io/gorm v1.24.2 h1:9wR6CFD+G8nOusLdvkZelOEhpJVwwHzpQOUM+REd6U0=
385-
gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
383+
gorm.io/gorm v1.25.1-0.20230505075827-e61b98d69677 h1:+vFpygNj+UclZztgzy/5ZGvkag6EH6moMm/MNTxkShk=
384+
gorm.io/gorm v1.25.1-0.20230505075827-e61b98d69677/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
386385
gorm.io/hints v1.1.0 h1:Lp4z3rxREufSdxn4qmkK3TLDltrM10FLTHiuqwDPvXw=
387386
gorm.io/hints v1.1.0/go.mod h1:lKQ0JjySsPBj3uslFzY3JhYDtqEwzm+G1hv8rWujB6Y=
388387
gorm.io/plugin/dbresolver v1.3.0 h1:uFDX3bIuH9Lhj5LY2oyqR/bU6pqWuDgas35NAPF4X3M=

internal/model/tbl_column.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ func (c *Column) multilineComment() bool {
8383

8484
func (c *Column) buildGormTag() field.GormTag {
8585
tag := field.GormTag{
86-
field.TagKeyGormColumn: c.Name(),
87-
field.TagKeyGormType: c.columnType(),
86+
field.TagKeyGormColumn: []string{c.Name()},
87+
field.TagKeyGormType: []string{c.columnType()},
8888
}
8989
isPriKey, ok := c.PrimaryKey()
9090
isValidPriKey := ok && isPriKey
@@ -105,9 +105,9 @@ func (c *Column) buildGormTag() field.GormTag {
105105
continue
106106
}
107107
if uniq, _ := idx.Unique(); uniq {
108-
tag.Set(field.TagKeyGormUniqueIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority))
108+
tag.Append(field.TagKeyGormUniqueIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority))
109109
} else {
110-
tag.Set(field.TagKeyGormIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority))
110+
tag.Append(field.TagKeyGormIndex, fmt.Sprintf("%s,priority:%d", idx.Name(), idx.Priority))
111111
}
112112
}
113113

tests/.expect/dal_2/model/users.gen.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/.expect/dal_3/model/users.gen.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/.expect/dal_4/model/users.gen.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/tables.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ CREATE TABLE `users` (
8484
`company_id` bigint(20) unsigned DEFAULT '666',
8585
`private_url` varchar(255) DEFAULT 'https://a.b.c ',
8686
PRIMARY KEY (`id`),
87-
KEY `idx_name` (`name`) USING BTREE
87+
KEY `idx_name` (`name`) USING BTREE,
88+
KEY `idx_name_company_id` (`name`,`company_id`)
8889
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
8990

9091

0 commit comments

Comments
 (0)