Skip to content

Commit 4ad061f

Browse files
authored
feat(contrib/drivers/pgsql): add array type varchar[] and text[] converting to Go []string support (#4000)
1 parent 5fa3341 commit 4ad061f

File tree

4 files changed

+75
-0
lines changed

4 files changed

+75
-0
lines changed

contrib/drivers/pgsql/pgsql_convert.go

+13
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package pgsql
88

99
import (
1010
"context"
11+
"github.com/lib/pq"
1112
"reflect"
1213
"strings"
1314

@@ -72,6 +73,10 @@ func (d *Driver) CheckLocalTypeForField(ctx context.Context, fieldType string, f
7273
"_int8":
7374
return gdb.LocalTypeInt64Slice, nil
7475

76+
case
77+
"_varchar", "_text":
78+
return gdb.LocalTypeStringSlice, nil
79+
7580
default:
7681
return d.Core.CheckLocalTypeForField(ctx, fieldType, fieldValue)
7782
}
@@ -116,6 +121,14 @@ func (d *Driver) ConvertValueForLocal(ctx context.Context, fieldType string, fie
116121
),
117122
), nil
118123

124+
// String slice.
125+
case "_varchar", "_text":
126+
var result pq.StringArray
127+
if err := result.Scan(fieldValue); err != nil {
128+
return nil, err
129+
}
130+
return result, nil
131+
119132
default:
120133
return d.Core.ConvertValueForLocal(ctx, fieldType, fieldValue)
121134
}

contrib/drivers/pgsql/pgsql_z_unit_init_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ func createTableWithDb(db gdb.DB, table ...string) (name string) {
8383
password varchar(32) NOT NULL,
8484
nickname varchar(45) NOT NULL,
8585
create_time timestamp NOT NULL,
86+
favorite_movie varchar[],
87+
favorite_music text[],
8688
PRIMARY KEY (id)
8789
) ;`, name,
8890
)); err != nil {

contrib/drivers/pgsql/pgsql_z_unit_model_test.go

+59
Original file line numberDiff line numberDiff line change
@@ -611,3 +611,62 @@ func Test_OrderRandom(t *testing.T) {
611611
t.Assert(len(result), TableSize)
612612
})
613613
}
614+
615+
func Test_ConvertSliceString(t *testing.T) {
616+
table := createTable()
617+
defer dropTable(table)
618+
619+
gtest.C(t, func(t *gtest.T) {
620+
type User struct {
621+
Id int
622+
Passport string
623+
Password string
624+
NickName string
625+
CreateTime *gtime.Time
626+
FavoriteMovie []string
627+
FavoriteMusic []string
628+
}
629+
630+
var (
631+
user User
632+
user2 User
633+
err error
634+
)
635+
636+
// slice string not null
637+
_, err = db.Model(table).Data(g.Map{
638+
"id": 1,
639+
"passport": "p1",
640+
"password": "pw1",
641+
"nickname": "n1",
642+
"create_time": CreateTime,
643+
"favorite_movie": g.Slice{"Iron-Man", "Spider-Man"},
644+
"favorite_music": g.Slice{"Hey jude", "Let it be"},
645+
}).Insert()
646+
t.AssertNil(err)
647+
648+
err = db.Model(table).Where("id", 1).Scan(&user)
649+
t.AssertNil(err)
650+
t.Assert(len(user.FavoriteMusic), 2)
651+
t.Assert(user.FavoriteMusic[0], "Hey jude")
652+
t.Assert(user.FavoriteMusic[1], "Let it be")
653+
t.Assert(len(user.FavoriteMovie), 2)
654+
t.Assert(user.FavoriteMovie[0], "Iron-Man")
655+
t.Assert(user.FavoriteMovie[1], "Spider-Man")
656+
657+
// slice string null
658+
_, err = db.Model(table).Data(g.Map{
659+
"id": 2,
660+
"passport": "p1",
661+
"password": "pw1",
662+
"nickname": "n1",
663+
"create_time": CreateTime,
664+
}).Insert()
665+
t.AssertNil(err)
666+
667+
err = db.Model(table).Where("id", 2).Scan(&user2)
668+
t.AssertNil(err)
669+
t.Assert(user2.FavoriteMusic, nil)
670+
t.Assert(len(user2.FavoriteMovie), 0)
671+
})
672+
}

database/gdb/gdb.go

+1
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ const (
458458
LocalTypeIntSlice LocalType = "[]int"
459459
LocalTypeInt64Slice LocalType = "[]int64"
460460
LocalTypeUint64Slice LocalType = "[]uint64"
461+
LocalTypeStringSlice LocalType = "[]string"
461462
LocalTypeInt64Bytes LocalType = "int64-bytes"
462463
LocalTypeUint64Bytes LocalType = "uint64-bytes"
463464
LocalTypeFloat32 LocalType = "float32"

0 commit comments

Comments
 (0)