Loading... gorm是一个很方便的数据库连接器,使用这个包:`gorm.io/gorm` #### 连接数据库 首先我们需要根据配置文件组件数据库链接,如下: ```go dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", AppConfig.DBUser, AppConfig.DBPassword, AppConfig.DBHost, AppConfig.DBPort, AppConfig.DBName) ``` `Sprintf`与c语言的类似,相当于把print出来的内容赋值给一个变量。 接下来就可以使用`gorm.Open()`连接数据库了 ```go db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logLevel), }) if err != nil { log.Fatalf("连接数据库失败: %v", err) } ``` #### 迁移数据库表 如果连接成功,就可以开始迁移表了。gorm的迁移功能十分强大,它可以检测数据库中表的类型和对应的数据结构类型是否一致,如果不一致就会自动修改,并且不会影响到原有的数据。如果数据库中没有这个表,它也会按照数据结构来创建。例如`InviteCode`就会创建`invitecodes`表,即把大写字母去除并在最后加上一个`s` 可以使用`db.AutoMigrate(&InviteCode{})`来完成迁移,这里的`InviteCode`是一个数据结构,如下: ```go type InviteCode struct { gorm.Model Code string `gorm:"type:varchar(100);uniqueIndex" json:"code"` Count int `gorm:"type:int;default:0" json:"count"` MaxCount int `gorm:"type:int;default:1" json:"max_count"` CreatedBy uint `gorm:"type:int" json:"created_by"` ExpTime *time.Time `gorm:"type:datetime;default:null" json:"exp_time"` IsAvailable bool `gorm:"type:boolean;default:true" json:"is_available"` BindGroup uint `gorm:"type:int" json:"bind_group"` } ``` `gorm.Model`会自动帮我们创建`id`,`updatetime`,`createtime`,`deletetime`等基础元素。值得注意的是,gorm会自动帮我们自动转换列名称,转换逻辑是大写字母全部转为小写,若是中间的大写字母则在大写字母前添加下划线。如上面的邀请码数据结构就会生成如下的表:  #### 创建默认管理员账户 迁移完成后,很重要的一步是需要判断是否需要创建默认管理员账户。当用户第一次启动时,应该创建一个管理员账户。当用户设置了`DEFAULT_ADMIN_USERNAME`和`DEFAULT_ADMIN_PASSWORD`时会根据设置创建对应的账号,如果没有设置,那么就会使用默认密码:`admin/admin123`来创建。 判断是否要创建的方法也很简单,只需要判断用户表是否为空即可。 首先判断用户数量: ```go var userCount int64 if err := db.Model(&User{}).Count(&userCount).Error; err != nil { log.Printf("检查用户数量失败: %v", err) return } ``` 接下来完成判断并写入数据库: ```go if userCount == 0 { defaultUsername := os.Getenv("DEFAULT_ADMIN_USERNAME") if defaultUsername == "" { defaultUsername = "admin" } defaultPassword := os.Getenv("DEFAULT_ADMIN_PASSWORD") if defaultPassword == "" { defaultPassword = "admin123" } hashedPassword, err := bcrypt.GenerateFromPassword([]byte(defaultPassword), bcrypt.DefaultCost) if err != nil { log.Printf("生成管理员密码哈希失败: %v", err) return } admin := User{ Username: defaultUsername, Password: string(hashedPassword), Role: "admin", IsBanned: false, } if err := db.Create(&admin).Error; err != nil { log.Printf("创建默认管理员失败: %v", err) } else { log.Printf("✅ 默认管理员创建成功 - 用户名: %s, 密码: %s", defaultUsername, defaultPassword) log.Println("⚠️ 请尽快登录并修改默认密码!") } } else { log.Printf("数据库中已存在 %d 个用户,跳过默认管理员创建", userCount) } ``` 最后修改:2025 年 08 月 09 日 © 允许规范转载 赞 不用打赏哦!