ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> ORM框架操作数据库都需要预先定义模型 [TOC] ## 连接mysql数据库 > DSN格式: > `[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]` ~~~ package main import ( "fmt" _ "github.com/jinzhu/gorm/dialects/mysql" "github.com/jinzhu/gorm" ) func main() { //配置MySQL连接参数 username := "root" //账号 password := "123456" //密码 host := "127.0.0.1" //数据库地址,可以是Ip或者域名 port := 3306 //数据库端口 Dbname := "tizi365" //数据库名 timeout := "10s" //连接超时,10秒 //拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout) //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。 db, err := gorm.Open("mysql", dsn) if err != nil { panic("连接数据库失败, error=" + err.Error()) } //延时关闭数据库连接 defer db.Close() } ~~~ ## 开启调试模式 > 开发阶段为了方便调试,可以将调试模式打开 ~~~ db.LogMode(true) ~~~ ## gorm连接池 > 在高并发实践中为了提高性能,往往会使用到数据库的连接池 **定义utils包,负责数据库初始化工作** ~~~ package utils import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) //定义全局的db对象,我们执行数据库操作主要通过他实现。 var _db *gorm.DB //包初始化函数,golang特性,每个包初始化的时候会自动执行init函数,这里用来初始化gorm。 func init() { //配置MySQL连接参数 username := "gintest" //账号 password := "gin123456" //密码 host := "127.0.0.1" //数据库地址,可以是Ip或者域名 port := 3306 //数据库端口 Dbname := "gintest" //数据库名 timeout := "10s" //连接超时,10秒 //拼接下dsn参数, dsn格式可以参考上面的语法,这里使用Sprintf动态拼接dsn参数,因为一般数据库连接参数,我们都是保存在配置文件里面,需要从配置文件加载参数,然后拼接dsn。 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout) // 声明err变量,下面不能使用:=赋值运算符,否则_db变量会当成局部变量,导致外部无法访问_db变量 var err error //连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。 _db, err = gorm.Open("mysql", dsn) if err != nil { panic("连接数据库失败, error=" + err.Error()) } //设置数据库连接池参数 _db.DB().SetMaxOpenConns(100) //设置数据库连接池最大连接数 _db.DB().SetMaxIdleConns(20) //连接池最大允许的空闲连接数,如果没有sql任务需要执行的连接数大于20,超过的连接会被连接池关闭。 } //获取gorm db对象,其他包需要执行数据库查询的时候,只要通过tools.getDB()获取db对象即可。 //不用担心协程并发使用同样的db对象会共用同一个连接,db对象在调用他的方法的时候会从数据库连接池中获取新的连接 func GetDB() *gorm.DB { return _db } ~~~ **使用例子** ~~~ package main import ( "fmt" "gintest/models" "gintest/utils" ) func main() { //获取DB db := utils.GetDB() //执行数据库插入操作 u := models.User{Username: "wk123", Password: "123456", CreateTime: 1112222} if err := db.Create(u).Error; err != nil { fmt.Println("insert failed") } fmt.Println(u.Username, u.Password) } ~~~ > 注意:使用连接池技术后,千万不要使用完db后调用db.Close关闭数据库连接,这样会导致整个数据库连接池关闭,导致连接池没有可用的连接。