## 1.数据库初始化 上一节讲了模型的定义,但是没有讲数据库的操作,数据库的连接,没办法看出效果,这一节开始前先对数据库进行初始化。 - 定义数据库配置信息 conf/database.ini ```ini [mysql] host=127.0.0.1 port=3306 database=test username=root password=root ``` - 定义数据库配置文件 pkg/config/database.go ```go package config import ( "cn.sockstack/gin_demo/pkg/helper" "gopkg.in/ini.v1" ) var Mysql *mysql type mysql struct { Host string `ini:"host"` Port int `ini:"port"` Database string `ini:"database"` Username string `ini:"username"` Password string `ini:"password"` source *ini.File } func (s *mysql) Load(path string) *mysql { var err error //判断配置文件是否存在 exists, err := helper.PathExists(path) if !exists { return s } s.source, err = ini.Load(path) if err != nil { panic(err) } return s } func (s *mysql)Init() *mysql { //判断配置是否加载成功 if s.source == nil { return s } //这里直接把配置映射到结构体 err := s.source.Section("mysql").MapTo(s) if err != nil { panic(err) } return s } ``` - 测试配置 pkg/config/database_test.go ```go package config import ( "fmt" "testing" ) func TestMysql(t *testing.T) { Mysql = (&mysql{}).Load("../../conf/database.ini").Init() fmt.Println(Mysql) if Mysql == nil { t.Fail() } } ``` 测试结果 ```shell === RUN TestMysql &{127.0.0.1 3306 test root root 0xc000116000} --- PASS: TestMysql (0.00s) PASS ``` - 初始化 `Mysql` 配置 pkg/config/init.go ``` golang package config func init() { ... // 添加 Mysql 配置初始化 Mysql = (&mysql{}).Load("conf/database.ini").Init() ... } ``` - 初始化数据库 models/init.go ```go package models import ( "cn.sockstack/gin_demo/pkg/config" "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) var ( DB *gorm.DB err error ) func Init() { DB, err = gorm.Open( "mysql", fmt.Sprintf( "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", config.Mysql.Username, config.Mysql.Password, config.Mysql.Host, config.Mysql.Port, config.Mysql.Database, ), ) if err != nil { panic(err) } //设置连接池 DB.DB().SetMaxIdleConns(10) DB.DB().SetMaxOpenConns(100) //数据库迁移 migrate() } func migrate() { DB.AutoMigrate(&User{}) } func Close() { defer DB.Close() } ``` ## 2.模型定义 首先定义一个模型,方便我们后续对模型进行操作。 ​ models/user.go ```go package models type User struct { ID uint `gorm:"primary_key"` Username string Password string } ``` 模型简单定义了两个字段,后面我们基于这个模型进行数据操作。 ## 3.模型的增删改查 repositories/user_repository.go ```go package user import ( "cn.sockstack/gin_demo/dto" "cn.sockstack/gin_demo/models" ) //CreateUser 创建用户 func CreateUser(dto dto.UserDto) error { user := models.User{} user.Username = dto.Username user.Password = dto.Password err := models.DB.Create(&user).Error return err } //GetUserByUsername 通过用户名查询用户 func GetUserByUsername(username string) models.User { user := models.User{} models.DB.Find(&user, models.DB.Where("username = ?",username)) return user } //UpdateUser 更新用户信息 func UpdateUser(userDto dto.UserDto) error { user := models.User{} if userDto.Username != "" { user.Username = userDto.Username } if userDto.Password != "" { user.Password = userDto.Password } err := models.DB.Model(&user).Update(&user).Error return err } //DeleteUserById 通过Id删除用户 func DeleteUserById(id uint) error { err := models.DB.Delete(&models.User{ID: id}).Error return err } ``` 测试数据库操作: repositories/user_repository_test.go ```go package user import ( "cn.sockstack/gin_demo/dto" "cn.sockstack/gin_demo/models" "cn.sockstack/gin_demo/pkg/config" "fmt" "testing" ) const ( username = "sockstack" password = "123456" update_username = "sockstack_update" ) func init() { config.Mysql.Load("../../conf/database.ini").Init() models.Init() } func TestCreateUser(t *testing.T) { userDto := dto.UserDto{ Username: username, Password: password, } err := CreateUser(userDto) if err != nil { t.Fail() } } func TestGetUserByUsername(t *testing.T) { user := GetUserByUsername(username) if user.Username == "" { t.Fail() } fmt.Println(user) } func TestUpdateUser(t *testing.T) { user := GetUserByUsername(username) userDto := dto.UserDto{ ID: user.ID, Username: update_username, Password: user.Password, } err := UpdateUser(userDto) if err != nil { fmt.Println(err.Error()) t.Fail() } } func TestDeleteUserById(t *testing.T) { user := GetUserByUsername(username) err := DeleteUserById(user.ID) if err != nil { t.Fail() } } ``` 测试结果: ```shell === RUN TestCreateUser --- PASS: TestCreateUser (0.00s) === RUN TestGetUserByUsername {2 sockstack 123456} --- PASS: TestGetUserByUsername (0.00s) === RUN TestUpdateUser --- PASS: TestUpdateUser (0.00s) === RUN TestDeleteUserById --- PASS: TestDeleteUserById (0.01s) PASS ``` ## 4.小结 这里只是简单的介绍gorm的增删改查,gorm还有许多高级的功能没有介绍到,感兴趣的可以去看文档了解。虽然这里没有把数据操作整合到service层,但是整合数据操作并不难,这里就不展开了,后面的实例实战再介绍。 > 更多内容请关注我的博客[SOCKSTACk](https://www.sockstack.cn)