package main import ( "gorm.io/driver/postgres" "gorm.io/gen" "gorm.io/gen/field" "gorm.io/gorm" "gorm.io/gorm/schema" "strings" ) var g *gen.Generator func main() { // 初始化 db, _ := gorm.Open( postgres.Open("host=localhost user=test password=test dbname=app port=5432 sslmode=disable TimeZone=Asia/Shanghai"), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, }, }, ) g = gen.NewGenerator(gen.Config{ OutPath: "web/queries", ModelPkgPath: "models", FieldNullable: true, FieldSignable: true, FieldWithTypeTag: true, Mode: gen.WithDefaultQuery | gen.WithoutContext, }) g.UseDB(db) // 公共参数 common := []gen.ModelOpt{ gen.FieldModify(func(field gen.Field) gen.Field { switch { case field.Type == "*time.Time": field.Type = "*orm.LocalDateTime" case field.Type == "time.Time": field.Type = "orm.LocalDateTime" case strings.Contains(field.Tags(), "numeric"): field.Type = "decimal.Decimal" } return field }), gen.FieldRename("contact_qq", "ContactQQ"), } // 生成模型 customs := make(map[string]any) resourceShort := g.GenerateModel("resource_short", common...) customs["resource_short"] = resourceShort resourceLong := g.GenerateModel("resource_long", common...) customs["resource_long"] = resourceLong resource := g.GenerateModel("resource", append(common, gen.FieldRelate(field.HasOne, "Short", resourceShort, &field.RelateConfig{ RelatePointer: true, GORMTag: field.GormTag{ "foreignKey": []string{"ResourceID"}, "references": []string{"ID"}, }, }), gen.FieldRelate(field.HasOne, "Long", resourceLong, &field.RelateConfig{ RelatePointer: true, GORMTag: field.GormTag{ "foreignKey": []string{"ResourceID"}, "references": []string{"ID"}, }, }), )...) customs["resource"] = resource trade := g.GenerateModel("trade", common...) customs["trade"] = trade refund := g.GenerateModel("refund", common...) customs["refund"] = refund bill := g.GenerateModel("bill", append(common, gen.FieldRelate(field.BelongsTo, "Trade", trade, &field.RelateConfig{ RelatePointer: true, GORMTag: field.GormTag{ "foreignKey": []string{"TradeID"}, }, }), gen.FieldRelate(field.BelongsTo, "Refund", refund, &field.RelateConfig{ RelatePointer: true, GORMTag: field.GormTag{ "foreignKey": []string{"RefundID"}, }, }), gen.FieldRelate(field.BelongsTo, "Resource", resource, &field.RelateConfig{ RelatePointer: true, GORMTag: field.GormTag{ "foreignKey": []string{"ResourceID"}, }, }), )...) customs["bill"] = bill edge := g.GenerateModel("edge", common...) customs["edge"] = edge proxy := g.GenerateModel("proxy", append(common, gen.FieldRelate(field.HasMany, "Edges", edge, &field.RelateConfig{ GORMTag: field.GormTag{ "foreignKey": []string{"ProxyID"}, "references": []string{"ID"}, }, }), )...) customs["proxy"] = proxy // 生成表结构 tables, _ := db.Migrator().GetTables() models := make([]interface{}, len(tables)) for i, name := range tables { if customs[name] != nil { models[i] = customs[name] } else { models[i] = g.GenerateModel(name, common...) } } g.ApplyBasic(models...) // 生成查询 g.Execute() }