数据库 | 青训营笔记

101 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

本次课程主题位设计模式之database。

数据库是我们后端开发的重中之重,一个性能良好的数据库对与我们整个系统的优化有很大的帮助。

后端应用程序与数据库进行连接,使用sql语句对数据库进行增删改查。 连接有以下几种类型:直接连接/conn,预编译/stmt,事务Tx。

gorm是一种设计简洁、功能强大,自由扩展的全功能ORM。 功能完善: 关联:一对一,一对多,单表自关联,多态。 事务:事务代码块,嵌套事务。 多数据库、读写分离、命名参数、map等 字段权限 软删除、批量数据处理等

grom相当于在后端程序和数据库之间又加了一层orm,orm提供接口,调用者调用接口,orm将其转化位sql,发送到数据库。

以下是我在做抖音项目是用到的一些关于orm的接口。

func InitDatabase() {
   var err error
   host := viper.GetString("mysql.host")
   port := viper.GetString("mysql.port")
   database := viper.GetString("mysql.database")
   username := viper.GetString("mysql.username")
   password := viper.GetString("mysql.password")
   args := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=true",
      username,
      password,
      host,
      port,
      database)
   log.Info(args)
   DataBase, err = gorm.Open("mysql", args)
   if err != nil {
      panic("failed to connect database ,err:" + err.Error())
   }
   log.Infof("connect database success,user:%s,database:%s", username, database)
}

func GetDB() *gorm.DB {
   return DataBase
}
func CloseDataBase() {
   DataBase.Close()
}
func UserRegister(userName, password string) (*message.DouyinUserRegisterResponse, error) {
   err := repository.UserNameIsExist(userName)
   if err != nil {
      return nil, err
   }
   info, err := repository.InsertUser(userName, password)
   if err != nil {
      return nil, err
   }
   user := messageUserInfo(info)
   registResponse := &message.DouyinUserRegisterResponse{
      UserId: info.Id,
      Token:  info.Token,
   }
   currentUser.Store(info.Token, user)
   return registResponse, nil
}

func UserLogin(userName, password string) (*message.DouyinUserLoginResponse, error) {
   info, err := repository.GetUserInfo(userName)
   if err != nil {
      return nil, err
   }
   //验证密码是否正确
   /*     if password != info.Password {

   } */
   err = bcrypt.CompareHashAndPassword([]byte(info.Password), []byte(password))
   if err != nil {
      return nil, errors.New("password error")
   }

   loginResponse := &message.DouyinUserLoginResponse{
      UserId: info.Id,
      Token:  info.Token,
   }
   user := messageUserInfo(info)
   currentUser.Store(info.Token, user)
   log.Infof("login user:%+v", user)
   return loginResponse, nil
}