在做一个Gin、Gorm的项目时,将Service、Model、db分开存放后进行调用发现会出现指针错误的问题,下面是我的部分代码。
数据库连接 db -> mysql.go
package db var Mysql *gorm.DB func init() { // dsn连接格式 dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", config.MYSQL_USER, config.MYSQL_PWD, config.MYSQL_HOST, config.MYSQL_PORT, config.MYSQL_DB, config.MYSQL_TIMEOUT) var err error Mysql, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("connect datebase faild, error:" + err.Error()) } }
model -> user.go
package model type User struct { // Id int `gorm:"primary_key"` gorm.Model Username string `gorm:"not null"` Password string `gorm:"not null"` }
service -> user.go
package service type UserService struct{} func (s *UserService) CreateUser(user *model.User) error { return db.Mysql.Create(user).Error }
调用逻辑
package v1 func Register(c *gin.Context) { userService := &service.UserService{} var user model.User user.Password = "123456" user.Username = "Ustinian" userService.CreateUser(&user) fmt.Println("用户注册") }
- 报错信息
5.17日更新(已解决)
dsn参数设置不对,timeout缺少单位。
参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name
隐式
init
没有调用,var Mysql *gorm.DB
是空指针推荐改为
func Init()
然后初始化显式调用