{"id":37819610,"url":"https://github.com/shenbaise9527/gogen","last_synced_at":"2026-01-16T15:40:55.461Z","repository":{"id":57626699,"uuid":"325924082","full_name":"shenbaise9527/gogen","owner":"shenbaise9527","description":"a cli tool to generate golang code","archived":false,"fork":false,"pushed_at":"2021-11-20T13:28:11.000Z","size":64,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-06-20T17:31:49.098Z","etag":null,"topics":["go-zero","gogen","gorm"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shenbaise9527.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-01-01T05:43:40.000Z","updated_at":"2021-11-20T13:28:13.000Z","dependencies_parsed_at":"2022-08-31T09:12:31.588Z","dependency_job_id":null,"html_url":"https://github.com/shenbaise9527/gogen","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/shenbaise9527/gogen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenbaise9527%2Fgogen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenbaise9527%2Fgogen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenbaise9527%2Fgogen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenbaise9527%2Fgogen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shenbaise9527","download_url":"https://codeload.github.com/shenbaise9527/gogen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shenbaise9527%2Fgogen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go-zero","gogen","gorm"],"created_at":"2026-01-16T15:40:54.786Z","updated_at":"2026-01-16T15:40:55.453Z","avatar_url":"https://github.com/shenbaise9527.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gogen\n根据数据库配置自动生成model代码(Golang语言),主要是使用[go-zero](https://github.com/tal-tech/go-zero)和[gorm](https://gorm.io/)\n\n## 支持功能\n* 支持mysql数据库,使用的是[gorm](https://gorm.io/).\n* 支持数据库熔断,使用的[go-zero](https://github.com/tal-tech/go-zero)的`core/breaker`组件.\n* 支持redis缓存,使用的[go-zero](https://github.com/tal-tech/go-zero)的`core/stores/cache`组件.\n* 支持OpenTracing链路追踪,使用的[tracing](https://github.com/shenbaise9527/tracing).\n* 支持单字段的主键,包括查询、更新和删除操作.\n* 支持多字段的组合主键,包括查询、更新和删除操作.\n* 支持单字段的唯一索引,包括查询、更新和删除操作.\n* 支持多字段的组合唯一索引,包括查询、更新和删除操作.\n\n## 命令\n``` bash\n$ ./gogen model datasource -h\nNAME:\n   gogen model datasource - generate model from datasource\n\nUSAGE:\n   gogen model datasource [command options] [arguments...]\n\nOPTIONS:\n   --url value      data soucre of database, mysql: \"root:password@tcp(127.0.0.1:3306)/database\"\n   --table value    the tables in the database,support for comma separation\n   --dir value      the target dir\n   --cache value    generate code with cache [optional]\n   --tracing value  generate code with tracing [optional]\n   --help, -h       show help (default: false)\n```\n\n## 例子\n``` bash\n$ ./gogen model datasource --url \"gozero:123456@tcp(192.168.20.151:3406)/gozero\" --table \"book,goods,user\" --dir ../models --tracing true --cache true\n\n$ ll \ntotal 40K\n-rwxrwxr-x 1 zhou.yingan zhou.yingan 3.9K Jan 25 16:29 bookmodel.go\n-rwxrwxr-x 1 zhou.yingan zhou.yingan  826 Jan 25 16:29 builder.go\n-rwxrwxr-x 1 zhou.yingan zhou.yingan 4.1K Jan 25 16:29 dbconn.go\n-rwxrwxr-x 1 zhou.yingan zhou.yingan 9.8K Jan 25 16:29 goodsmodel.go\n-rwxrwxr-x 1 zhou.yingan zhou.yingan  12K Jan 25 16:29 usermodel.go\n```\n\n数据库相关的封装在`dbconn.go`文件中.\n``` go\npackage models\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/tal-tech/go-zero/core/breaker\"\n\t\"github.com/tal-tech/go-zero/core/stores/cache\"\n\t\"github.com/tal-tech/go-zero/core/syncx\"\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/gorm\"\n)\n\nconst (\n\tmaxIdleConns                       = 64\n\tmaxOpenConns                       = 64\n\tmaxLifetime                        = time.Minute\n\tcacheSafeGapBetweenIndexAndPrimary = time.Second * 5\n)\n\nvar (\n\texclusiveCalls = syncx.NewSharedCalls()\n\tstats          = cache.NewCacheStat(\"dbc\")\n\tconnManager    = syncx.NewResourceManager()\n)\n\ntype (\n\t// DBConn gorm db.\n\tDBConn struct {\n\t\t*gorm.DB\n\t\tbreaker.Breaker\n\t}\n\n\t// CachedDBConn with cache.\n\tCachedDBConn struct {\n\t\tconn  *DBConn\n\t\tcache cache.Cache\n\t}\n\n\tQueryFn   func(conn *DBConn, v interface{}) error\n\tExecFn    func(conn *DBConn) (int64, error)\n\tPrimaryFn func(data interface{}) (string, error)\n)\n\n// NewDBConn new gorm object.\nfunc NewDBConn(datasource string) *DBConn {\n\tval, err := connManager.GetResource(datasource, func() (io.Closer, error) {\n\t\tdb, err := newDBConnection(datasource)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\treturn db, nil\n\t})\n\tif err != nil {\n\t\treturn nil\n\t}\n\n\treturn val.(*DBConn)\n}\n\nfunc newDBConnection(datasource string) (*DBConn, error) {\n\tdb := \u0026DBConn{Breaker: breaker.NewBreaker()}\n\tconn, err := sql.Open(\"mysql\", datasource)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tconn.SetMaxIdleConns(maxIdleConns)\n\tconn.SetMaxOpenConns(maxOpenConns)\n\tconn.SetConnMaxLifetime(maxLifetime)\n\tdb.DB, err = gorm.Open(mysql.New(mysql.Config{Conn: conn}), \u0026gorm.Config{\n\t\tPrepareStmt: true,\n\t})\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn db, nil\n}\n\n// Transact start a transaction.\nfunc (conn *DBConn) Transact(fn func(*DBConn) error) error {\n\treturn conn.DoWithAcceptable(\n\t\tfunc() error {\n\t\t\treturn conn.Transaction(func(tx *gorm.DB) error {\n\t\t\t\tdb := \u0026DBConn{DB: tx}\n\t\t\t\treturn fn(db)\n\t\t\t})\n\t\t}, conn.Acceptable)\n}\n\n// Close closer interface\nfunc (conn *DBConn) Close() error {\n\treturn nil\n}\n\n// Acceptable accept\nfunc (conn *DBConn) Acceptable(err error) bool {\n\tok := err == nil || errors.Is(err, sql.ErrNoRows) || errors.Is(err, sql.ErrTxDone)\n\treturn ok\n}\n\n// NewCachedDBConn with cache.\nfunc NewCachedDBConn(datasource string, c cache.CacheConf, opts ...cache.Option) CachedDBConn {\n\tcc := CachedDBConn{\n\t\tconn:  NewDBConn(datasource),\n\t\tcache: cache.NewCache(c, exclusiveCalls, stats, sql.ErrNoRows, opts...),\n\t}\n\n\treturn cc\n}\n\n// QueryRow single row with cache.\nfunc (cc CachedDBConn) QueryRow(v interface{}, key string, query QueryFn) error {\n\treturn cc.cache.Take(v, key, func(v interface{}) error {\n\t\terr := cc.conn.DoWithAcceptable(func() error {\n\t\t\treturn query(cc.conn, v)\n\t\t}, cc.conn.Acceptable)\n\n\t\treturn err\n\t})\n}\n\n// QueryRowIndex single row with cache by unique index.\nfunc (cc CachedDBConn) QueryRowIndex(key string, primaryValue, data interface{}, query QueryFn, primaryFn PrimaryFn, queryByPrimary QueryFn) error {\n\tvar found bool\n\terr := cc.cache.TakeWithExpire(primaryValue, key, func(v interface{}, expire time.Duration) error {\n\t\terr := cc.conn.DoWithAcceptable(func() error {\n\t\t\treturn query(cc.conn, data)\n\t\t}, cc.conn.Acceptable)\n\t\tif err != nil {\n\t\t\treturn nil\n\t\t}\n\n\t\tfound = true\n\t\tprimaryKey, err := primaryFn(data)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\treturn cc.cache.SetCacheWithExpire(primaryKey, data, expire+cacheSafeGapBetweenIndexAndPrimary)\n\t})\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif found {\n\t\treturn nil\n\t}\n\n\tprimaryKey, err := primaryFn(primaryValue)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = cc.QueryRow(data, primaryKey, queryByPrimary)\n\n\treturn err\n}\n\n// Exec exec with cache.\nfunc (cc CachedDBConn) Exec(exec ExecFn, keys ...string) (int64, error) {\n\tvar rowsaffected int64\n\tvar err error\n\terr = cc.conn.DoWithAcceptable(\n\t\tfunc() error {\n\t\t\trowsaffected, err = exec(cc.conn)\n\n\t\t\treturn err\n\t\t}, cc.conn.Acceptable)\n\tif err != nil {\n\t\treturn rowsaffected, err\n\t}\n\n\terr = cc.cache.DelCache(keys...)\n\n\treturn rowsaffected, err\n}\n\n// Transact start a transaction.\nfunc (cc CachedDBConn) Transact(fn func(*DBConn) error) error {\n\treturn cc.conn.Transact(fn)\n}\n```\n\n`bookmodel.go`对应`book`表,`goodsmodel.go`对应`goods`表,`usermodel.go`对应`user`表.\n\n`goodsmodel.go`的内容:\n``` go\npackage models\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/opentracing/opentracing-go/ext\"\n\t\"github.com/shenbaise9527/tracing\"\n)\n\nvar (\n\tgoodsFieldNames = fieldNames(\u0026Goods{})\n\n\tgoodsRowsNoPA = strings.Join(removeField(goodsFieldNames, \"GOODSID\", \"GOODSCODE\"), \"=?,\") + \"=?\"\n\n\tgoodsRowsUkGoodsGoodsnameNoPA = strings.Join(removeField(goodsFieldNames, \"GOODSNAME\", \"GOODSID\", \"GOODSCODE\"), \"=?,\") + \"=?\"\n\n\tcacheGoodsPKPrefix = \"cache#Goods#PK\"\n\n\tcacheGoodsUkGoodsGoodsnamePrefix = \"cache#Goods#UkGoodsGoodsname\"\n)\n\ntype (\n\t// GoodsModel model interface\n\tGoodsModel interface {\n\t\t// Insert insert the record\n\t\tInsert(ctx context.Context, data *Goods) error\n\n\t\t// FindOne query the record by the primary key\n\t\tFindOne(ctx context.Context, goodsid int64, goodscode string) (*Goods, error)\n\n\t\t// FindByUkGoodsGoodsname query the record by the unique key-UK_GOODS_GOODSNAME\n\t\tFindByUkGoodsGoodsname(ctx context.Context, goodsname string) (*Goods, error)\n\n\t\t// Update update the record by the primary key\n\t\tUpdate(ctx context.Context, data *Goods) error\n\n\t\t// UpdateByUkGoodsGoodsname update the record by the unique key-UK_GOODS_GOODSNAME\n\t\tUpdateByUkGoodsGoodsname(ctx context.Context, data *Goods) error\n\n\t\t// Delete delete the record\n\t\tDelete(ctx context.Context, data *Goods) error\n\n\t\t// Delete delete the record by the primary key\n\t\tDeleteByPrimary(ctx context.Context, goodsid int64, goodscode string) error\n\n\t\t// DeleteByUkGoodsGoodsname delete the record by the unique key-UK_GOODS_GOODSNAME\n\t\tDeleteByUkGoodsGoodsname(ctx context.Context, goodsname string) error\n\t}\n\n\t// defaultGoodsModel model object\n\tdefaultGoodsModel struct {\n\t\tCachedDBConn\n\t\ttable string\n\t}\n\n\t// Goods .\n\tGoods struct {\n\t\tGoodsid       int64     `json:\"goodsid\" gorm:\"column:GOODSID;autoIncrement;primaryKey\"`\n\t\tGoodscode     string    `json:\"goodscode\" gorm:\"column:GOODSCODE;primaryKey\"` // ()\n\t\tGoodsname     string    `json:\"goodsname\" gorm:\"column:GOODSNAME\"`\n\t\tMarketid      int64     `json:\"marketid\" gorm:\"column:MARKETID\"`         // ID\n\t\tGoodsgroupid  int64     `json:\"goodsgroupid\" gorm:\"column:GOODSGROUPID\"` // ID\n\t\tGoodsstatus   int32     `json:\"goodsstatus\" gorm:\"column:GOODSSTATUS\"`   // - 1: 2: 3: 4: 5: 6: 7:\n\t\tCurrencyid    int64     `json:\"currencyid\" gorm:\"column:CURRENCYID\"`     // ID\n\t\tGoodunitid    int64     `json:\"goodunitid\" gorm:\"column:GOODUNITID\"`     // ID\n\t\tAgreeunit     float64   `json:\"agreeunit\" gorm:\"column:AGREEUNIT\"`\n\t\tDecimalplace  int32     `json:\"decimalplace\" gorm:\"column:DECIMALPLACE\"`\n\t\tListingdate   time.Time `json:\"listingdate\" gorm:\"column:LISTINGDATE\"`\n\t\tLasttradedate time.Time `json:\"lasttradedate\" gorm:\"column:LASTTRADEDATE\"` // ()\n\t}\n\n\t// goodsPrimary primary key struct.\n\tgoodsPrimary struct {\n\t\tGoodsid   int64  `json:\"goodsid\" gorm:\"column:GOODSID;autoIncrement;primaryKey\"`\n\t\tGoodscode string `json:\"goodscode\" gorm:\"column:GOODSCODE;primaryKey\"` // ()\n\t}\n)\n\n// TableName is goods\nfunc (Goods) TableName() string {\n\treturn \"goods\"\n}\n\n// NewGoodsModel new model object\nfunc NewGoodsModel(conn CachedDBConn) GoodsModel {\n\treturn \u0026defaultGoodsModel{\n\t\tCachedDBConn: conn,\n\t\ttable:        \"goods\",\n\t}\n}\n\n// Insert insert the record\nfunc (m *defaultGoodsModel) Insert(ctx context.Context, data *Goods) error {\n\tvar err error\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"Insert\")\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\terr = m.conn.DoWithAcceptable(\n\t\tfunc() error {\n\t\t\terr := m.conn.Create(data).Error\n\n\t\t\treturn err\n\t\t}, m.conn.Acceptable)\n\n\treturn err\n}\n\n// FindOne query the record by the primary key\nfunc (m *defaultGoodsModel) FindOne(ctx context.Context, goodsid int64, goodscode string) (*Goods, error) {\n\tvar err error\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, goodsid, goodscode)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"FindOne\")\n\tspan.SetTag(\"key\", primaryKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\tvar resp Goods\n\terr = m.QueryRow(\u0026resp, primaryKey, func(conn *DBConn, v interface{}) error {\n\t\treturn conn.Where(\"goodsid = ? and goodscode = ?\", goodsid, goodscode).First(v).Error\n\t})\n\n\treturn \u0026resp, err\n}\n\n// FindByUkGoodsGoodsname query the record by the unique key-UK_GOODS_GOODSNAME\nfunc (m *defaultGoodsModel) FindByUkGoodsGoodsname(ctx context.Context, goodsname string) (*Goods, error) {\n\tvar err error\n\tukgoodsgoodsnameKey := fmt.Sprintf(\"%s#%v\", cacheGoodsUkGoodsGoodsnamePrefix, goodsname)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"FindByUkGoodsGoodsname\")\n\tspan.SetTag(\"key\", ukgoodsgoodsnameKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\tvar data Goods\n\n\tvar primaryKey goodsPrimary\n\terr = m.QueryRowIndex(\n\t\tukgoodsgoodsnameKey, \u0026primaryKey, \u0026data,\n\t\tfunc(conn *DBConn, v interface{}) error {\n\t\t\treturn conn.Where(\"goodsname = ?\", goodsname).First(v).Error\n\t\t},\n\t\tm.buildPrimaryKey,\n\t\tfunc(conn *DBConn, v interface{}) error {\n\t\t\treturn conn.Where(\"goodsid = ? and goodscode = ?\", primaryKey.Goodsid, primaryKey.Goodscode).First(v).Error\n\t\t},\n\t)\n\n\treturn \u0026data, err\n}\n\nfunc (m *defaultGoodsModel) buildPrimaryKey(v interface{}) (string, error) {\n\tswitch d := v.(type) {\n\tcase *Goods:\n\t\treturn fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, d.Goodsid, d.Goodscode), nil\n\tcase *goodsPrimary:\n\t\treturn fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, d.Goodsid, d.Goodscode), nil\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"cant support type: %v\", d)\n\t}\n}\n\n// Update update the record by the primary key\nfunc (m *defaultGoodsModel) Update(ctx context.Context, data *Goods) error {\n\tvar err error\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, data.Goodsid, data.Goodscode)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"Update\")\n\tspan.SetTag(\"key\", primaryKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\t_, err = m.Exec(func(conn *DBConn) (int64, error) {\n\t\tquery := fmt.Sprintf(\"update %s set %s where goodsid = ? and goodscode = ?\", m.table, goodsRowsNoPA)\n\t\tdb := conn.Exec(query, data.Goodsname, data.Marketid, data.Goodsgroupid, data.Goodsstatus, data.Currencyid, data.Goodunitid, data.Agreeunit, data.Decimalplace, data.Listingdate, data.Lasttradedate, data.Goodsid, data.Goodscode)\n\n\t\treturn db.RowsAffected, db.Error\n\t}, primaryKey)\n\n\treturn err\n}\n\n// UpdateByUkGoodsGoodsname update the record by the unique key-UK_GOODS_GOODSNAME\nfunc (m *defaultGoodsModel) UpdateByUkGoodsGoodsname(ctx context.Context, data *Goods) error {\n\tvar err error\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, data.Goodsid, data.Goodscode)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"UpdateByUkGoodsGoodsname\")\n\tspan.SetTag(\"key\", primaryKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\t_, err = m.Exec(func(conn *DBConn) (int64, error) {\n\t\tquery := fmt.Sprintf(\"update %s set %s where goodsname = ?\", m.table, goodsRowsUkGoodsGoodsnameNoPA)\n\t\tdb := conn.Exec(query, data.Marketid, data.Goodsgroupid, data.Goodsstatus, data.Currencyid, data.Goodunitid, data.Agreeunit, data.Decimalplace, data.Listingdate, data.Lasttradedate, data.Goodsname)\n\n\t\treturn db.RowsAffected, db.Error\n\t}, primaryKey)\n\n\treturn err\n}\n\n// Delete delete the record\nfunc (m *defaultGoodsModel) Delete(ctx context.Context, data *Goods) error {\n\tvar err error\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, data.Goodsid, data.Goodscode)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"Delete\")\n\tspan.SetTag(\"key\", primaryKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\terr = m.delete(data)\n\n\treturn err\n}\n\n// Delete delete the record by the primary key\nfunc (m *defaultGoodsModel) DeleteByPrimary(ctx context.Context, goodsid int64, goodscode string) error {\n\tvar err error\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, goodsid, goodscode)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"DeleteByPrimary\")\n\tspan.SetTag(\"key\", primaryKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\tdata, err := m.FindOne(ctx, goodsid, goodscode)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = m.delete(data)\n\n\treturn err\n}\n\n// DeleteByUkGoodsGoodsname delete the record by the unique key-UK_GOODS_GOODSNAME\nfunc (m *defaultGoodsModel) DeleteByUkGoodsGoodsname(ctx context.Context, goodsname string) error {\n\tvar err error\n\tukgoodsgoodsnameKey := fmt.Sprintf(\"%s#%v\", cacheGoodsUkGoodsGoodsnamePrefix, goodsname)\n\tspan := tracing.ChildOfSpanFromContext(ctx, \"goodsmodel\")\n\tdefer span.Finish()\n\text.DBStatement.Set(span, \"DeleteByUkGoodsGoodsname\")\n\tspan.SetTag(\"key\", ukgoodsgoodsnameKey)\n\tdefer func() {\n\t\tif err != nil {\n\t\t\text.Error.Set(span, true)\n\t\t\tspan.LogKV(\"error\", err.Error())\n\t\t}\n\t}()\n\n\tdata, err := m.FindByUkGoodsGoodsname(ctx, goodsname)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = m.delete(data)\n\n\treturn err\n}\n\nfunc (m *defaultGoodsModel) delete(data *Goods) error {\n\tprimaryKey := fmt.Sprintf(\"%s#%v#%v\", cacheGoodsPKPrefix, data.Goodsid, data.Goodscode)\n\n\tukgoodsgoodsnameKey := fmt.Sprintf(\"%s#%v\", cacheGoodsUkGoodsGoodsnamePrefix, data.Goodsname)\n\n\t_, err := m.Exec(func(conn *DBConn) (int64, error) {\n\t\tdb := conn.Delete(Goods{}, \"goodsid = ? and goodscode = ?\", data.Goodsid, data.Goodscode)\n\n\t\treturn db.RowsAffected, db.Error\n\t}, primaryKey, ukgoodsgoodsnameKey)\n\n\treturn err\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshenbaise9527%2Fgogen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshenbaise9527%2Fgogen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshenbaise9527%2Fgogen/lists"}