alarm_snapshot.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package main
  2. import (
  3. "fwh-toolbox-server/config"
  4. "log"
  5. "gorm.io/driver/postgres"
  6. "gorm.io/gen"
  7. "gorm.io/gorm"
  8. "gorm.io/gorm/logger"
  9. )
  10. // Dynamic SQL
  11. type DataQuerier interface {
  12. // SELECT * FROM @@table
  13. // WHERE log_time BETWEEN @start AND @end
  14. FilterByTimeRange(start, end string) ([]gen.T, error)
  15. }
  16. type FileRecordQuerier interface {
  17. // SELECT state FROM @@table WHERE id = @id LIMIT 1
  18. QueryState(id int64) (gen.M, error)
  19. }
  20. func main() {
  21. // 指定生成代码的具体相对目录(相对于当前文件),默认:./query
  22. // 默认生成需要使用WithContext之后才可以查询的代码,但可以通过设置gen.WithoutContext禁用该模式
  23. g := gen.NewGenerator(gen.Config{
  24. // 默认会在 OutPath 目录生成CRUD代码,并且同目录下生成 model 包
  25. // 所以OutPath最终package不能设置为model,在有数据库表同步的情况下会产生冲突
  26. // 若一定要使用,可以通过ModelPkgPath单独指定model package的名称
  27. OutPath: "./models/model_pgsql/query_alarm_snapshot",
  28. ModelPkgPath: "model_alarm_snapshot",
  29. // gen.WithoutContext: 禁用WithContext模式
  30. // gen.WithDefaultQuery: 生成一个全局Query对象Q
  31. // gen.WithQueryInterface: 生成Query接口
  32. Mode: gen.WithDefaultQuery | gen.WithQueryInterface, // generate mode
  33. })
  34. // 通常复用项目中已有的SQL连接配置db(*grom.DB)
  35. // 非必须,但如果需要复用连接是的gorm.Config或需要连接数据库同步表信息则必须设置
  36. // gormdb, _ := gorm.Open(mysql.Open("root:@(127.0.0.1:3306)/demo?charset=utf8mb4&parseTime=True&loc=Local"))
  37. // g.UseDB(gormdb) // reuse your gorm db
  38. cfg, _ := config.LoadConfig()
  39. db, err := InitPostgreSQL(cfg.PostgresDSN)
  40. if err != nil {
  41. log.Printf("PgSql Database Open Filed!\n%s\n", err.Error())
  42. return
  43. }
  44. // 切换到指定 schema
  45. db.Exec("SET search_path TO alarm_snapshot")
  46. g.UseDB(db)
  47. // 从连接的数据库为所有表生成Model结构体和CRUD代码
  48. // g.ApplyBasic(g.GenerateAllTable()...)
  49. // 也可以手动指定需要生成代码的数据表
  50. SiteAlarmSnapshotDataModel := g.GenerateModelAs("alarm_snapshot.site_alarm_snapshot_data", "SiteAlarmSnapshotData")
  51. SiteAlarmSnapshotFileRecordModel := g.GenerateModelAs("alarm_snapshot.site_alarm_snapshot_file_record", "SiteAlarmSnapshotFileRecord")
  52. g.ApplyBasic(SiteAlarmSnapshotDataModel, SiteAlarmSnapshotFileRecordModel)
  53. // Generate basic type-safe DAO API for struct `model.User` following conventions
  54. // g.ApplyBasic(model.User{})
  55. // Generate Type Safe API with Dynamic SQL defined on Querier interface for `model.User` and `model.Company`
  56. // g.ApplyInterface(func(Querier) {}, model.User{}, model.Company{})
  57. g.ApplyInterface(func(DataQuerier) {}, SiteAlarmSnapshotDataModel)
  58. g.ApplyInterface(func(FileRecordQuerier) {}, SiteAlarmSnapshotFileRecordModel)
  59. // Set Default DIY TableName method for the generated all struct
  60. g.WithOpts(gen.WithMethod(gen.DefaultMethodTableWithNamer))
  61. // Generate the code
  62. g.Execute()
  63. }
  64. func InitPostgreSQL(dsn string) (*gorm.DB, error) {
  65. db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
  66. Logger: logger.Default.LogMode(logger.Info),
  67. })
  68. if err != nil {
  69. log.Printf("failed to connect to PostgreSQL: %v", err)
  70. return nil, err
  71. }
  72. // 自动迁移
  73. // db.AutoMigrate(&models.User{}, …)
  74. return db, nil
  75. }