Skip to content

Commit ce8b536

Browse files
zhonghuaxunGMgqcn
andauthored
Parse database empty json field to empty object( fix issue 2105 ) (#2213)
* Parse database empty json field to empty object( fix issue 2105 ) * fix issue #2105 Co-authored-by: Xu <zhenghao.xu> Co-authored-by: John Guo <john@johng.cn>
1 parent 8e5a03f commit ce8b536

File tree

7 files changed

+475
-408
lines changed

7 files changed

+475
-408
lines changed

contrib/drivers/mysql/mysql_feature_scanlist_test.go

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -477,134 +477,6 @@ CREATE TABLE %s (
477477
})
478478
}
479479

480-
// https://github.com/gogf/gf/issues/1570
481-
func Test_Table_Relation_Issue1570(t *testing.T) {
482-
var (
483-
tableUser = "user_" + gtime.TimestampMicroStr()
484-
tableUserDetail = "user_detail_" + gtime.TimestampMicroStr()
485-
tableUserScores = "user_scores_" + gtime.TimestampMicroStr()
486-
)
487-
if _, err := db.Exec(ctx, fmt.Sprintf(`
488-
CREATE TABLE %s (
489-
uid int(10) unsigned NOT NULL AUTO_INCREMENT,
490-
name varchar(45) NOT NULL,
491-
PRIMARY KEY (uid)
492-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
493-
`, tableUser)); err != nil {
494-
gtest.Error(err)
495-
}
496-
defer dropTable(tableUser)
497-
498-
if _, err := db.Exec(ctx, fmt.Sprintf(`
499-
CREATE TABLE %s (
500-
uid int(10) unsigned NOT NULL AUTO_INCREMENT,
501-
address varchar(45) NOT NULL,
502-
PRIMARY KEY (uid)
503-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
504-
`, tableUserDetail)); err != nil {
505-
gtest.Error(err)
506-
}
507-
defer dropTable(tableUserDetail)
508-
509-
if _, err := db.Exec(ctx, fmt.Sprintf(`
510-
CREATE TABLE %s (
511-
id int(10) unsigned NOT NULL AUTO_INCREMENT,
512-
uid int(10) unsigned NOT NULL,
513-
score int(10) unsigned NOT NULL,
514-
PRIMARY KEY (id)
515-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
516-
`, tableUserScores)); err != nil {
517-
gtest.Error(err)
518-
}
519-
defer dropTable(tableUserScores)
520-
521-
type EntityUser struct {
522-
Uid int `json:"uid"`
523-
Name string `json:"name"`
524-
}
525-
type EntityUserDetail struct {
526-
Uid int `json:"uid"`
527-
Address string `json:"address"`
528-
}
529-
type EntityUserScores struct {
530-
Id int `json:"id"`
531-
Uid int `json:"uid"`
532-
Score int `json:"score"`
533-
}
534-
type Entity struct {
535-
User *EntityUser
536-
UserDetail *EntityUserDetail
537-
UserScores []*EntityUserScores
538-
}
539-
540-
// Initialize the data.
541-
gtest.C(t, func(t *gtest.T) {
542-
var err error
543-
for i := 1; i <= 5; i++ {
544-
// User.
545-
_, err = db.Insert(ctx, tableUser, g.Map{
546-
"uid": i,
547-
"name": fmt.Sprintf(`name_%d`, i),
548-
})
549-
t.AssertNil(err)
550-
// Detail.
551-
_, err = db.Insert(ctx, tableUserDetail, g.Map{
552-
"uid": i,
553-
"address": fmt.Sprintf(`address_%d`, i),
554-
})
555-
t.AssertNil(err)
556-
// Scores.
557-
for j := 1; j <= 5; j++ {
558-
_, err = db.Insert(ctx, tableUserScores, g.Map{
559-
"uid": i,
560-
"score": j,
561-
})
562-
t.AssertNil(err)
563-
}
564-
}
565-
})
566-
567-
// Result ScanList with struct elements and pointer attributes.
568-
gtest.C(t, func(t *gtest.T) {
569-
var users []Entity
570-
// User
571-
err := db.Model(tableUser).
572-
Where("uid", g.Slice{3, 4}).
573-
Fields("uid").
574-
Order("uid asc").
575-
ScanList(&users, "User")
576-
t.AssertNil(err)
577-
t.AssertNil(err)
578-
t.Assert(len(users), 2)
579-
t.Assert(users[0].User, &EntityUser{3, ""})
580-
t.Assert(users[1].User, &EntityUser{4, ""})
581-
// Detail
582-
err = db.Model(tableUserDetail).
583-
Where("uid", gdb.ListItemValues(users, "User", "Uid")).
584-
Order("uid asc").
585-
ScanList(&users, "UserDetail", "User", "uid:Uid")
586-
t.AssertNil(err)
587-
t.AssertNil(err)
588-
t.Assert(users[0].UserDetail, &EntityUserDetail{3, "address_3"})
589-
t.Assert(users[1].UserDetail, &EntityUserDetail{4, "address_4"})
590-
// Scores
591-
err = db.Model(tableUserScores).
592-
Where("uid", gdb.ListItemValues(users, "User", "Uid")).
593-
Order("id asc").
594-
ScanList(&users, "UserScores", "User", "uid:Uid")
595-
t.AssertNil(err)
596-
t.AssertNil(err)
597-
t.Assert(len(users[0].UserScores), 5)
598-
t.Assert(len(users[1].UserScores), 5)
599-
t.Assert(users[0].UserScores[0].Uid, 3)
600-
t.Assert(users[0].UserScores[0].Score, 1)
601-
t.Assert(users[0].UserScores[4].Score, 5)
602-
t.Assert(users[1].UserScores[0].Uid, 4)
603-
t.Assert(users[1].UserScores[0].Score, 1)
604-
t.Assert(users[1].UserScores[4].Score, 5)
605-
})
606-
}
607-
608480
func Test_Table_Relation_Many_ModelScanList(t *testing.T) {
609481
var (
610482
tableUser = "user_" + gtime.TimestampMicroStr()

contrib/drivers/mysql/mysql_feature_with_test.go

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,107 +1988,3 @@ PRIMARY KEY (id)
19881988
t.Assert(user.UserScores[4].Score, 5)
19891989
})
19901990
}
1991-
1992-
// https://github.com/gogf/gf/issues/1401
1993-
func Test_With_Feature_Issue1401(t *testing.T) {
1994-
var (
1995-
table1 = "parcels"
1996-
table2 = "parcel_items"
1997-
)
1998-
array := gstr.SplitAndTrim(gtest.DataContent(`issue1401.sql`), ";")
1999-
for _, v := range array {
2000-
if _, err := db.Exec(ctx, v); err != nil {
2001-
gtest.Error(err)
2002-
}
2003-
}
2004-
defer dropTable(table1)
2005-
defer dropTable(table2)
2006-
2007-
gtest.C(t, func(t *gtest.T) {
2008-
type NItem struct {
2009-
Id int `json:"id"`
2010-
ParcelId int `json:"parcel_id"`
2011-
}
2012-
2013-
type ParcelItem struct {
2014-
gmeta.Meta `orm:"table:parcel_items"`
2015-
NItem
2016-
}
2017-
2018-
type ParcelRsp struct {
2019-
gmeta.Meta `orm:"table:parcels"`
2020-
Id int `json:"id"`
2021-
Items []*ParcelItem `json:"items" orm:"with:parcel_id=Id"`
2022-
}
2023-
2024-
parcelDetail := &ParcelRsp{}
2025-
err := db.Model(table1).With(parcelDetail.Items).Where("id", 3).Scan(&parcelDetail)
2026-
t.AssertNil(err)
2027-
t.Assert(parcelDetail.Id, 3)
2028-
t.Assert(len(parcelDetail.Items), 1)
2029-
t.Assert(parcelDetail.Items[0].Id, 2)
2030-
t.Assert(parcelDetail.Items[0].ParcelId, 3)
2031-
})
2032-
}
2033-
2034-
// https://github.com/gogf/gf/issues/1412
2035-
func Test_With_Feature_Issue1412(t *testing.T) {
2036-
var (
2037-
table1 = "parcels"
2038-
table2 = "items"
2039-
)
2040-
array := gstr.SplitAndTrim(gtest.DataContent(`issue1412.sql`), ";")
2041-
for _, v := range array {
2042-
if _, err := db.Exec(ctx, v); err != nil {
2043-
gtest.Error(err)
2044-
}
2045-
}
2046-
defer dropTable(table1)
2047-
defer dropTable(table2)
2048-
2049-
gtest.C(t, func(t *gtest.T) {
2050-
type Items struct {
2051-
gmeta.Meta `orm:"table:items"`
2052-
Id int `json:"id"`
2053-
Name string `json:"name"`
2054-
}
2055-
2056-
type ParcelRsp struct {
2057-
gmeta.Meta `orm:"table:parcels"`
2058-
Id int `json:"id"`
2059-
ItemId int `json:"item_id"`
2060-
Items Items `json:"items" orm:"with:Id=ItemId"`
2061-
}
2062-
2063-
entity := &ParcelRsp{}
2064-
err := db.Model("parcels").With(Items{}).Where("id=3").Scan(&entity)
2065-
t.AssertNil(err)
2066-
t.Assert(entity.Id, 3)
2067-
t.Assert(entity.ItemId, 0)
2068-
t.Assert(entity.Items.Id, 0)
2069-
t.Assert(entity.Items.Name, "")
2070-
})
2071-
2072-
gtest.C(t, func(t *gtest.T) {
2073-
type Items struct {
2074-
gmeta.Meta `orm:"table:items"`
2075-
Id int `json:"id"`
2076-
Name string `json:"name"`
2077-
}
2078-
2079-
type ParcelRsp struct {
2080-
gmeta.Meta `orm:"table:parcels"`
2081-
Id int `json:"id"`
2082-
ItemId int `json:"item_id"`
2083-
Items Items `json:"items" orm:"with:Id=ItemId"`
2084-
}
2085-
2086-
entity := &ParcelRsp{}
2087-
err := db.Model("parcels").With(Items{}).Where("id=30000").Scan(&entity)
2088-
t.AssertNE(err, nil)
2089-
t.Assert(entity.Id, 0)
2090-
t.Assert(entity.ItemId, 0)
2091-
t.Assert(entity.Items.Id, 0)
2092-
t.Assert(entity.Items.Name, "")
2093-
})
2094-
}

0 commit comments

Comments
 (0)