开始前的准备
1 2
| $ go get gorm.io/gorm $ go get gorm.io/driver/mysql
|
我们将使用gorm来使用数据库,项目中我们使用mysql数据库
集成gorm
配置信息
config/database.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| func init() {
config.Add("database", func() map[string]interface{} { return map[string]interface{}{
"connection": config.Env("DB_CONNECTION", "mysql"),
"mysql": map[string]interface{}{
"host": config.Env("DB_HOST", "127.0.0.1"), "port": config.Env("DB_PORT", "3306"), "database": config.Env("DB_DATABASE", "go_api_practice"), "username": config.Env("DB_USERNAME", ""), "password": config.Env("DB_PASSWORD", ""), "charset": "utf8mb4",
"max_idle_connections": config.Env("DB_MAX_IDLE_CONNECTIONS", 100), "max_open_connections": config.Env("DB_MAX_OPEN_CONNECTIONS", 25), "max_life_seconds": config.Env("DB_MAX_LIFE_SECONDS", 5*60), }, } }) }
|
.env
1 2 3 4 5 6 7 8 9 10
| . . . DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=go_api_practice DB_USERNAME=root DB_PASSWORD=123456 DB_DEBUG=2
|
先用前面的配置配置好数据库相关的参数
连接数据库工具类
pkg/database/database.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var DB *gorm.DB var SQLDB *sql.DB
func Connect(dbConfig gorm.Dialector, _logger gormlogger.Interface) { var err error DB, err = gorm.Open(dbConfig, &gorm.Config{ Logger: _logger, })
if err != nil { fmt.Println(err.Error()) }
SQLDB, err = DB.DB() if err != nil { fmt.Println(err.Error()) }
}
|
启动连接
和前面启动gin的思路类似,我们在bootstrap
包中编写启动类
bootstrap/database.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| func SetupDB() {
var dbConfig gorm.Dialector switch config.Get("database.connection") { case "mysql": dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=%v&parseTime=True&multiStatements=true&loc=Local", config.Get("database.mysql.username"), config.Get("database.mysql.password"), config.Get("database.mysql.host"), config.Get("database.mysql.port"), config.Get("database.mysql.database"), config.Get("database.mysql.charset"), ) dbConfig = mysql.New(mysql.Config{ DSN: dsn, }) default: panic(errors.New("database connection not supported")) }
database.Connect(dbConfig, logger.Default.LogMode(logger.Info))
database.SQLDB.SetMaxOpenConns(config.GetInt("database.mysql.max_open_connections")) database.SQLDB.SetMaxIdleConns(config.GetInt("database.mysql.max_idle_connections")) database.SQLDB.SetConnMaxLifetime(time.Duration(config.GetInt("database.mysql.max_life_seconds")) * time.Second) }
|
使用上前面的配置信息,连接数据库,最后我们在main
中调用这个函数即可
main.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func main() { var env string flag.StringVar(&env, "env", "", "") flag.Parse() config.InitConfig(env)
router := gin.New()
bootstrap.SetupDB()
bootstrap.SetupRoute(router)
err := router.Run(":" + config.Get("app.port")) if err != nil { fmt.Println(err) } }
|
这一部分的内容无非是配置一些基本信息,总体上没有什么难度,下面我们来创建用户模型
创建用户模型
app/models/model.go
1 2 3 4 5 6 7 8 9 10
| type BaseModel struct { ID uint64 `gorm:"column:id;primaryKey;autoIncrement;" json:"id,omitempty"` }
type CommonTimestampsField struct { CreatedAt time.Time `gorm:"column:created_at;index;" json:"created_at,omitempty"` UpdatedAt time.Time `gorm:"column:updated_at;index;" json:"updated_at,omitempty"` }
|
我们先创建一些基本的字段以供将来的模型重复使用
app/models/user/user_model.go
1 2 3 4 5 6 7 8 9 10 11
| type User struct { models.BaseModel
Name string `json:"name,omitempty"` Email string `json:"-"` Phone string `json:"-"` Password string `json:"-"`
models.CommonTimestampsField }
|
这里我们创建了用户模型,我们顺便为这个模型创建一些必要的工具函数
app/models/user/user_util.go
1 2 3 4 5 6 7 8 9 10 11
| func IsEmailExist(email string) bool { var count int64 database.DB.Model(User{}).Where("email = ?", email).Count(&count) return count > 0 }
func IsPhoneExist(phone string) bool { var count int64 database.DB.Model(User{}).Where("phone = ?", phone).Count(&count) return count > 0 }
|
这样,我们就完成了现阶段的数据库集成,我们此时还没有在数据库中建立数据表,我们可以使用gorm
中的自动迁移功能来帮助我们自动创建数据库表
数据库自动迁移
bootstrap/database.go
1 2 3 4 5 6
| func SetupDB() { . . . database.DB.AutoMigrate(&user.User{}) }
|
gorm
会根据User
结构体的字段来自动创建数据表,但是不会覆盖已经创建的字段,如果你已经自己创建了自己的数据表,你可以删除后重试。
本节的内容并不难,主要是完成了一些基本信息的创建。