Go連接MySQL
首先我們來看如何使用Golang連接MySQL
安裝所需要的驅動
go get github.com/go-sql-driver/mysql
導入所需要使用的包
import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" )
連接MySQL需要使用的語句
func main() { //"用戶名:密碼@[連接方式](主機名:端口號)/數據庫名" db, _ := sql.Open("mysql", "root:pwd@(localhost)/database") // 設置連接數據庫的參數 defer db.Close() //關閉數據庫 err := db.Ping() //連接數據庫 if err != nil { fmt.Println("Open database fail !") //連接失敗 return } fmt.Println("Connection succdess !") //連接成功 }
案例演示
建表
先在MySQL中創建一個名為test的數據庫,在此數據庫中創建一個user表,包含五個字段id, name, age, sex, phone,并插入幾條數據,推薦使用 Navicat等圖形化管理工具,不用麻煩地在 MySQL 命令行寫SQL語句。表如下:
連接MySQL
將數據庫的相關配置寫成常量,創建InitDB函數用于連接數據庫,創建Query函數用于查詢數據,全部代碼如下:
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "github.com/pkg/errors" "strings" ) // 數據庫配置 const ( userName = "root" password = "******" ip = "127.0.0.1" port = "3306" dbName = "test" ) // Db數據庫連接池 var DB *sql.DB type User struct { id int64 name string age int8 sex int8 phone string } // 注意方法名大寫,就是public func InitDB() { //構建連接:"用戶名:密碼@tcp(IP:端口)/數據庫?charset=utf8" path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "") //打開數據庫,前者是驅動名,所以要導入: _ "github.com/go-sql-driver/mysql" DB, _ = sql.Open("mysql", path) //設置數據庫最大連接數 DB.SetConnMaxLifetime(100) //設置上數據庫最大閑置連接數 DB.SetMaxIdleConns(10) //驗證連接 if err := DB.Ping(); err != nil { fmt.Println("open database fail !") return } fmt.Println("connnection success !") } // 查詢操作 func Query() { var user User rows, e := DB.Query("select * from user where id in (1,2,3)") if e == nil { errors.New("query incur error") } for rows.Next() { e := rows.Scan(&user.sex, &user.phone, &user.name, &user.id, &user.age) if e != nil { fmt.Println(user.sex, user.phone, user.name, user.id, user.age) } } rows.Close() } func main() { InitDB() Query() defer DB.Close() }
以上是使用Golang連接MySQL數據庫的基礎方法,接下來我們看Gorm是如何連接MySQL。
Gorm
什么是ORM
對象關系映射 :Object-Relational Mapping,用于在關系數據庫和面向對象編程語言的堆之間轉換數據。這樣就創建了一個虛擬的對象數據庫,可以從編程語言內部使用。
ORM提供了自動支持,用于將元組映射到對象并返回,同時考慮所有這些差異。問題的核心在于將對象的邏輯表示轉換為能夠存儲在數據庫中的原子形式,同時保留對象的屬性和它們之間的關系,以便在需要時可以重新加載為對象。如果實現了這種存儲和檢索功能,則稱這些對象是持久的。
優點
提高開發效率,減少開發成本
使開發更加面向對象
可移植性
可以輕松引入額外功能,如數據緩存。
加快開發速度 - 消除了重復的SQL代碼的需要。
減少開發時間、成本
克服特定于供應商的SQL差異 - ORM知道如何編寫特定于供應商的SQL
缺點
在學習使用ORM時會損失生產力
失去了對代碼實際執行內容的理解 - 使用SQL時,開發人員更能控制
ORM有變慢的傾向
ORM無法與復雜查詢的SQL查詢競爭
Grom介紹
Gorm是一種功能強大且對開發人員友好的ORM庫,支持主流的數據庫。
GORM 官方支持的數據庫類型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB
安裝
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
連接MySQL
和基本的連接方法區別不大
import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func main() { dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) }
**注意:**想要正確的處理time.Time,您需要帶上parseTime參數, (更多參數) 要支持完整的 UTF-8 編碼,您需要將charset=utf8更改為charset=utf8mb4查看此文章獲取詳情
GORM MODEL 定義
在使用ORM工具時,我們需要在代碼中定義模型(Models)與數據庫中的數據表進行映射,模型是標準的 struct,由 Go 的基本數據類型、實現了Scanner和Valuer接口的自定義類型及其指針或別名組成
約定
GORM 傾向于約定優于配置 默認情況下,GORM 使用ID作為主鍵,使用結構體名的蛇形復數作為表名,字段名的蛇形作為列名,并使用CreatedAt、UpdatedAt字段追蹤創建、更新時間
如果您遵循 GORM 的約定,您就可以少寫的配置、代碼。如果約定不符合您的實際要求, GORM 允許你配置它們
gorm.Model
GORM 定義一個gorm.Model結構體,其包括字段ID、CreatedAt、UpdatedAt、DeletedAt
// gorm.Model 的定義 type Model struct { ID uint `gorm:"primaryKey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` }
您也可以將其嵌入到自己的結構體當中,如下:
type User struct { gorm.Model Name string } // 等效于 type User struct { ID uint `gorm:"primaryKey"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` Name string }
當然您也可以完全使用自己定義的結構體,不一定需要使用它的model
-
數據庫
+關注
關注
7文章
3799瀏覽量
64388 -
函數
+關注
關注
3文章
4331瀏覽量
62610 -
MySQL
+關注
關注
1文章
809瀏覽量
26565 -
GitHub
+關注
關注
3文章
471瀏覽量
16442
原文標題:Go操作數據庫與Gorm講解
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論