diff --git a/Makefile b/Makefile index 98d4300..990edb6 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ dev: wait link: - ssh -NCPf main -L 3306:localhost:3306 -L 19530:localhost:19530 + ssh -NCPf ai -L 3306:localhost:3306 -L 19530:localhost:19530 -L 4080:localhost:4080 -L 5002:localhost:5002 # 编译项目 build: diff --git a/api/graphql.go b/api/graphql.go index 3332c03..5530c4f 100644 --- a/api/graphql.go +++ b/api/graphql.go @@ -8,6 +8,8 @@ import ( "strings" "git.satori.love/gameui/webp/models" + "github.com/doug-martin/goqu/v9" + _ "github.com/doug-martin/goqu/v9/dialect/mysql" "github.com/graphql-go/graphql" "github.com/graphql-go/graphql/language/ast" "github.com/jmoiron/sqlx" @@ -396,7 +398,7 @@ func NewSchema(config Config) (graphql.Schema, error) { Args: graphql.FieldConfigArgument{ "era": &graphql.ArgumentConfig{Type: graphql.String, Description: "筛选图像中指定上线年份的"}, "device": &graphql.ArgumentConfig{Type: graphql.String, Description: "游戏设备"}, - "sort": &graphql.ArgumentConfig{Type: graphql.String, Description: "排序方法"}, + "sort": &graphql.ArgumentConfig{Type: graphql.String, Description: "排序方法", DefaultValue: "id"}, "order": &graphql.ArgumentConfig{Type: orderType, Description: "排序方向", DefaultValue: "ASC"}, "orientation": &graphql.ArgumentConfig{Type: graphql.String, Description: "筛选横屏竖屏图像"}, "follower": &graphql.ArgumentConfig{Type: graphql.Int, Description: "获取指定ID用户的关注列表发布的图像"}, @@ -441,16 +443,18 @@ func NewSchema(config Config) (graphql.Schema, error) { mapstructure.Decode(p.Args, &args) // 限制长度防止全表扫描 - var limit = 10 - if args.First != 0 { - limit = args.First - } else if args.Last != 0 { - limit = args.Last - } + //var limit = 10 + //if args.First != 0 { + // limit = args.First + //} else if args.Last != 0 { + // limit = args.Last + //} var total int var images []Image - var query = db.Limit(limit) + //var query = db.Limit(limit).Table("web_images") + //order := "ORDER BY " + p.Args["sort"].(string) + " " + p.Args["order"].(string) + var query = goqu.Dialect("mysql").Select("id", goqu.L("ROW_NUMBER() OVER(ORDER BY id ASC)").As("row_num")).From("web_images") // 参数映射 var argFormat = []string{"id", "width", "height", "content", "remark", "description", "tags", "rank", "comment_num", "praise_count", "collect_count", "article_id", "user_id"} @@ -458,7 +462,8 @@ func NewSchema(config Config) (graphql.Schema, error) { // 筛选条件 for _, format := range argFormat { if p.Args[format] != nil { - query = query.Where(fmt.Sprintf("web_images.%s = ?", format), p.Args[format]) + //query = query.Where(fmt.Sprintf("web_images.%s = ?", format), p.Args[format]) + query.Where(goqu.Ex{fmt.Sprintf("web_images.%s = ?", format): p.Args[format]}) } } @@ -503,7 +508,7 @@ func NewSchema(config Config) (graphql.Schema, error) { return map[string]interface{}{"list": []Image{}, "total": 0}, nil } - query = query.Where("web_images.id IN (?)", item) + query = query.Where(goqu.Ex{"web_images.id": goqu.Op{"in": item}}) } // 筛选:相似图像 @@ -524,36 +529,16 @@ func NewSchema(config Config) (graphql.Schema, error) { fmt.Println("Interest:", args.Interest) } - //// 数据库中筛选: 关注列表 - //if args.Follower != 0 { - // // 返回JSON数组(2.5秒) - // var item string - // if err := db.Raw(` - // SELECT JSON_ARRAYAGG(web_images.id) AS json_result - // FROM web_fans - // INNER JOIN web_images ON web_images.user_id = web_fans.blogger_id - // WHERE web_fans.follower_id = ? AND web_images.article_category_top_id = 22 - // `, args.Follower).Scan(&item).Error; err != nil { - // fmt.Println("获取关注列表失败", err) - // return nil, err - // } - // var ids []int - // json.Unmarshal([]byte(item), &ids) - // sort.Slice(ids, func(i, j int) bool { - // return ids[i] > ids[j] // 按照降序排列 - // }) - // id_list = append(id_list, ids) - //} - // 筛选:时间段 applyTimeCondition := func(name string, str string) { parts := strings.Split(str, "-") - query = query.Where(fmt.Sprintf("YEAR(%s) = ?", name), parts[0]) + query = query.Where(goqu.Ex{fmt.Sprintf("YEAR(%s)", name): parts[0]}) + if len(parts) > 1 { - query = query.Where(fmt.Sprintf("MONTH(%s) = ?", name), parts[1]) + query = query.Where(goqu.Ex{fmt.Sprintf("MONTH(%s)", name): parts[1]}) } if len(parts) > 2 { - query = query.Where(fmt.Sprintf("DAY(%s) = ?", name), parts[2]) + query = query.Where(goqu.Ex{fmt.Sprintf("DAY(%s)", name): parts[2]}) } } @@ -569,22 +554,31 @@ func NewSchema(config Config) (graphql.Schema, error) { // 数据库中筛选:横屏纵屏 if p.Args["orientation"] != nil { - query.Where("article_orientation = ?", p.Args["orientation"]) + query = query.Where(goqu.Ex{"article_orientation": p.Args["orientation"]}) } // 数据库中筛选:游戏设备 if p.Args["device"] != nil { - query = query.Joins("JOIN web_article ON web_images.article_id = web_article.id AND web_article.device = ?", p.Args["device"]) + query = query.Join(goqu.T("web_article"), goqu.On( + goqu.I("web_images.article_id").Eq(goqu.I("web_article.id")), + goqu.I("web_article.device").Eq(p.Args["device"]), + )) } // 数据库中筛选:游戏上线年份 if p.Args["era"] != nil { - query = query.Joins("JOIN web_article ON web_images.article_id = web_article.id AND web_article.era = ?", p.Args["era"]) + query = query.Join(goqu.T("web_article"), goqu.On( + goqu.I("web_images.article_id").Eq(goqu.I("web_article.id")), + goqu.I("web_article.era").Eq(p.Args["era"]), + )) } // 数据库中筛选:按关注列表 if p.Args["follower"] != nil { - query = query.Joins("JOIN web_fans ON web_images.user_id = web_fans.blogger_id AND web_fans.follower_id = ?", p.Args["follower"]) + query = query.Join(goqu.T("web_fans"), goqu.On( + goqu.I("web_images.user_id").Eq(goqu.I("web_fans.blogger_id")), + goqu.I("web_fans.follower_id").Eq(p.Args["follower"]), + )) } // 排序 @@ -604,10 +598,10 @@ func NewSchema(config Config) (graphql.Schema, error) { total = len(list) - var count int64 - if len(list) > 0 { - query = query.Count(&count) - } + //var count int64 + //if len(list) > 0 { + // query = query.Count(&count) + //} // 截取: 分页 if args.After != 0 { @@ -654,29 +648,61 @@ func NewSchema(config Config) (graphql.Schema, error) { // 存在外部筛选条件 if len(id_list) > 0 && len(list) > 0 { - query = query.Where("id IN ?", list) + //query = query.Where("id IN ?", list) + //where = fmt.Sprintf("web_images.id IN ?", ) } - for index, item := range LoadItem(p.Info.FieldASTs[0].SelectionSet.Selections) { - fmt.Println(index, item) - query = query.Preload(item) + // 取所有数据的前N条 + sql, _, _ := query.Where(goqu.Ex{"article_category_top_id": 22}).ToSQL() + + // 取所有数据的前N条 + var cursor string + if args.After != 0 { + cursor = fmt.Sprintf(`WHERE row_num > (SELECT row_num FROM RankedArticles WHERE id = %d)`, args.After) } - // 排序规则 - if args.Sort != "" && args.Order != "" { - query = query.Order(fmt.Sprintf("%s %s", args.Sort, args.Order)) - } + // 取大于游标的数据 + sql = fmt.Sprintf(` + WITH RankedArticles AS (%s) + SELECT web_images.* FROM web_images JOIN( + SELECT id FROM RankedArticles %s ORDER BY row_num LIMIT 5 + ) AS LimitedRanked ON web_images.id = LimitedRanked.id; + `, sql, cursor) - // 输出(游戏截图分类ID为22) - if err := query.Where("article_category_top_id = 22").Find(&images).Error; err != nil { + fmt.Println(sql) + + if err := db.Raw(sql).Scan(&images).Error; err != nil { fmt.Println("获取图像列表失败", err) return nil, err } - if total == 0 && count > 0 { - total = int(count) + var ids []int + for _, item := range images { + ids = append(ids, item.ID) } + var find = db.Where("web_images.id IN ?", ids) + for index, item := range LoadItem(p.Info.FieldASTs[0].SelectionSet.Selections) { + fmt.Println(index, item) + find = find.Preload(item) + } + + if err := find.Find(&images).Error; err != nil { + fmt.Println("获取图像列表失败", err) + return nil, err + } + + //var order string + //// 排序规则 + //if p.Args["sort"] != nil && p.Args["order"] != nil { + // // query = query.Order(fmt.Sprintf("%s %s", args.Sort, args.Order)) + // order = "ORDER BY " + p.Args["sort"].(string) + " " + p.Args["order"].(string) + " " + //} + + //if total == 0 && count > 0 { + // total = int(count) + //} + return map[string]interface{}{ "list": images, "total": total, diff --git a/go.mod b/go.mod index 178fa8a..8e4e083 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/alibabacloud-go/tea v1.2.1 github.com/alibabacloud-go/vod-20170321/v2 v2.16.10 github.com/disintegration/imaging v1.6.2 + github.com/doug-martin/goqu/v9 v9.19.0 github.com/graphql-go/graphql v0.8.1 github.com/graphql-go/handler v0.2.3 github.com/hashicorp/golang-lru/v2 v2.0.7 @@ -22,6 +23,7 @@ require ( ) require ( + filippo.io/edwards25519 v1.1.0 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect @@ -37,7 +39,9 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/lib/pq v1.10.9 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-sqlite3 v1.14.24 // indirect github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -66,7 +70,7 @@ require ( require ( github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible github.com/chai2010/webp v1.1.1 - github.com/go-sql-driver/mysql v1.7.1 + github.com/go-sql-driver/mysql v1.8.1 github.com/sizeofint/gif-to-webp v0.0.0-20210224202734-e9d7ed071591 golang.org/x/image v0.20.0 // indirect ) diff --git a/go.sum b/go.sum index 9fd6d41..0fc35ac 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,9 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= github.com/alibabacloud-go/darabonba-openapi v0.1.18 h1:3eUVmAr7WCJp7fgIvmCd9ZUyuwtJYbtUqJIed5eXCmk= @@ -41,8 +45,11 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= +github.com/doug-martin/goqu/v9 v9.19.0 h1:PD7t1X3tRcUiSdc5TEyOFKujZA5gs3VSA7wxSvBx7qo= +github.com/doug-martin/goqu/v9 v9.19.0/go.mod h1:nf0Wc2/hV3gYK9LiyqIrzBEVGlI8qW3GuDCEobC4wBQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -55,10 +62,11 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= -github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= -github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -103,12 +111,16 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd h1:9ilgTEqZSdEPbJKSrRGB1TIHTaF7DqVDIwn8/azcaBk= github.com/milvus-io/milvus-proto/go-api v0.0.0-20230301092744-7efc6eec15fd/go.mod h1:148qnlmZ0Fdm1Fq+Mj/OW2uDoEP25g3mjh0vMGtkgmk= github.com/milvus-io/milvus-sdk-go/v2 v2.2.1 h1:6p/lrxZCGkw5S2p5GPWy/BUmO6mVUNfrczv98uAnhoU= @@ -159,6 +171,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= @@ -175,6 +188,8 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -292,6 +307,7 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=