package main import ( "fwh-toolbox-server/config" "log" "gorm.io/driver/postgres" "gorm.io/gen" "gorm.io/gorm" "gorm.io/gorm/logger" ) // Dynamic SQL type DataQuerier interface { // SELECT * FROM @@table // WHERE log_time BETWEEN @start AND @end FilterByTimeRange(start, end string) ([]gen.T, error) } type FileRecordQuerier interface { // SELECT state FROM @@table WHERE id = @id LIMIT 1 QueryState(id int64) (gen.M, error) } func main() { // 指定生成代码的具体相对目录(相对于当前文件),默认:./query // 默认生成需要使用WithContext之后才可以查询的代码,但可以通过设置gen.WithoutContext禁用该模式 g := gen.NewGenerator(gen.Config{ // 默认会在 OutPath 目录生成CRUD代码,并且同目录下生成 model 包 // 所以OutPath最终package不能设置为model,在有数据库表同步的情况下会产生冲突 // 若一定要使用,可以通过ModelPkgPath单独指定model package的名称 OutPath: "./models/model_pgsql/query_alarm_snapshot", ModelPkgPath: "model_alarm_snapshot", // gen.WithoutContext: 禁用WithContext模式 // gen.WithDefaultQuery: 生成一个全局Query对象Q // gen.WithQueryInterface: 生成Query接口 Mode: gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode }) // 通常复用项目中已有的SQL连接配置db(*grom.DB) // 非必须,但如果需要复用连接是的gorm.Config或需要连接数据库同步表信息则必须设置 // gormdb, _ := gorm.Open(mysql.Open("root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local")) // g.UseDB(gormdb) // reuse your gorm db cfg, _ := config.LoadConfig() db, err := InitPostgreSQL(cfg.PostgresDSN) if err != nil { log.Printf("PgSql Database Open Filed!\n%s\n", err.Error()) return } // 切换到指定 schema db.Exec("SET search_path TO alarm_snapshot") g.UseDB(db) // 从连接的数据库为所有表生成Model结构体和CRUD代码 // g.ApplyBasic(g.GenerateAllTable()...) // 也可以手动指定需要生成代码的数据表 SiteAlarmSnapshotDataModel := g.GenerateModelAs("alarm_snapshot.site_alarm_snapshot_data", "SiteAlarmSnapshotData") SiteAlarmSnapshotFileRecordModel := g.GenerateModelAs("alarm_snapshot.site_alarm_snapshot_file_record", "SiteAlarmSnapshotFileRecord") g.ApplyBasic(SiteAlarmSnapshotDataModel, SiteAlarmSnapshotFileRecordModel) // Generate basic type-safe DAO API for struct `model.User` following conventions // g.ApplyBasic(model.User{}) // Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company` // g.ApplyInterface(func(Querier) {}, model.User{}, model.Company{}) g.ApplyInterface(func(DataQuerier) {}, SiteAlarmSnapshotDataModel) g.ApplyInterface(func(FileRecordQuerier) {}, SiteAlarmSnapshotFileRecordModel) // Set Default DIY TableName method for the generated all struct g.WithOpts(gen.WithMethod(gen.DefaultMethodTableWithNamer)) // Generate the code g.Execute() } func InitPostgreSQL(dsn string) (*gorm.DB, error) { db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), }) if err != nil { log.Printf("failed to connect to PostgreSQL: %v", err) return nil, err } // 自动迁移 // db.AutoMigrate(&models.User{}, …) return db, nil }