大家都知道,gin框架中数据表的生成是通过AutoMigrate。
gorm 使用结构体标识 table ,即一个 struct 对应数据库里的一个 table 。
type BaseModel struct {
ID uint `gorm:"primary_key" json:"id"`
CreatedAt JsonTime `json:"created_at"`
UpdatedAt JsonTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `sql:"index" json:"-"`
}
type User struct {
BaseModel
Username string `json:"username"`
Password string `json:"password"`
Avatar string `json:"avatar"`
Age *int
}
err = db.AutoMigrate(&models.User{})
if err != nil {
log.Fatal(err)
}
但是在特殊情况下,即使调用了AutoMigrate,也不会生成数据表。
err := *gorm.DB.AutoMigrate(&BaseModel{})
if err != nil {
return
}
这个问题可能是项目启动顺序的问题
func init() {
// 初始化项目配置
setting.Setup()
// 加载日志模块
logging.Setup()
// 加载数据库
dao.Setup()
// 加载路由
router.Setup()
}
func main() {
// 模型绑定
err := *gorm.DB.AutoMigrate(&BaseModel{})
if err != nil {
return
}
}
如上述代码,没有看到Run命令,是因为run命令被封装到了加载路由内,导致在init函数内项目就已经初始化完成,之后的main函数中AutoMigrate命令,未被加载。以至于表生成失败!