package main import ( "gorm.io/driver/postgres" "gorm.io/gen" "gorm.io/gen/field" "gorm.io/gorm" "gorm.io/gorm/schema" ) 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", Mode: gen.WithDefaultQuery | gen.WithoutContext, }) g.UseDB(db) // 生成模型 common := []gen.ModelOpt{ gen.FieldModify(func(field gen.Field) gen.Field { if field.Type == "time.Time" { field.Type = "common.LocalDateTime" } return field }), } customs := make(map[string]any) resourcePss := g.GenerateModel("resource_pss", common...) customs["resource_pss"] = resourcePss resource := g.GenerateModel("resource", append(common, gen.FieldRelate(field.HasOne, "Pss", resourcePss, &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 tables, _ := db.Migrator().GetTables() models := make([]interface{}, len(tables)) for i, name := range tables { if customs[name] != nil { models[i] = customs[name] continue } models[i] = genBasic(name, common...) } g.ApplyBasic(models...) // 生成查询 g.Execute() } func genBasic(name string, opts ...gen.ModelOpt) any { return g.GenerateModel(name, gen.FieldType("created_at", "common.LocalDateTime"), gen.FieldType("updated_at", "common.LocalDateTime"), ) }