> ORM框架操作數據庫都需要預先定義模型
[TOC]
## 連接mysql數據庫
> DSN格式:
> `[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=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關閉數據庫連接,這樣會導致整個數據庫連接池關閉,導致連接池沒有可用的連接。
- 基礎知識
- 開發環境
- 包名規則
- 包初始化 (init)
- 基礎數據類型
- 基礎類型轉換
- 格式化輸出
- go指針
- 流程控制語句
- 函數定義
- 匿名函數
- 數組和切片
- map集合
- 結構體
- Interface接口
- 日期處理
- 數學計算
- 正則表達式
- 協程 (并發處理)
- channel
- waitgroup
- mutex (鎖機制)
- websocket
- protobuf
- Redis
- 錯誤處理
- 打包程序
- NSQ消息隊列
- 單元測試
- beego
- 安裝入門
- Gin
- 快速入門
- 路由與控制器
- 處理請求參數
- 表單驗證
- 處理響應結果
- 渲染HTML模版
- 訪問靜態文件
- Gin中間件
- Cookie處理
- Session處理
- Gin上傳文件
- swagger
- pprof性能測試
- GORM
- 入門教程
- 模型定義
- 數據庫連接
- 插入數據
- 查詢數據
- 更新數據
- 刪除數據
- 事務處理
- 關聯查詢
- 屬于 (BELONG TO)
- 一對一 (Has One)
- 一對多 (Has Many)
- 多對多 (Many to Many)
- 預加載 (Preloading)
- 錯誤處理
- 第三方常用插件
- viper 讀取配置文件
- zap 高性能日志
- Nginx代理配置
- Goland 快捷鍵