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