Go連接MySQL
首先我們來(lái)看如何使用Golang連接MySQL
安裝所需要的驅(qū)動(dòng)
go get github.com/go-sql-driver/mysql
導(dǎo)入所需要使用的包
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
連接MySQL需要使用的語(yǔ)句
func main() {
//"用戶名:密碼@[連接方式](主機(jī)名:端口號(hào))/數(shù)據(jù)庫(kù)名"
db, _ := sql.Open("mysql", "root:pwd@(localhost)/database") // 設(shè)置連接數(shù)據(jù)庫(kù)的參數(shù)
defer db.Close() //關(guān)閉數(shù)據(jù)庫(kù)
err := db.Ping() //連接數(shù)據(jù)庫(kù)
if err != nil {
fmt.Println("Open database fail !") //連接失敗
return
}
fmt.Println("Connection succdess !") //連接成功
}
案例演示
建表
先在MySQL中創(chuàng)建一個(gè)名為test的數(shù)據(jù)庫(kù),在此數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)user表,包含五個(gè)字段id, name, age, sex, phone,并插入幾條數(shù)據(jù),推薦使用 Navicat等圖形化管理工具,不用麻煩地在 MySQL 命令行寫SQL語(yǔ)句。表如下:

連接MySQL
將數(shù)據(jù)庫(kù)的相關(guān)配置寫成常量,創(chuàng)建InitDB函數(shù)用于連接數(shù)據(jù)庫(kù),創(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ù)庫(kù)配置 const ( userName = "root" password = "******" ip = "127.0.0.1" port = "3306" dbName = "test" ) // Db數(shù)據(jù)庫(kù)連接池 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ù)庫(kù)?charset=utf8" path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "") //打開(kāi)數(shù)據(jù)庫(kù),前者是驅(qū)動(dòng)名,所以要導(dǎo)入: _ "github.com/go-sql-driver/mysql" DB, _ = sql.Open("mysql", path) //設(shè)置數(shù)據(jù)庫(kù)最大連接數(shù) DB.SetConnMaxLifetime(100) //設(shè)置上數(shù)據(jù)庫(kù)最大閑置連接數(shù) DB.SetMaxIdleConns(10) //驗(yàn)證連接 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ù)庫(kù)的基礎(chǔ)方法,接下來(lái)我們看Gorm是如何連接MySQL。
Gorm
什么是ORM
對(duì)象關(guān)系映射 :Object-Relational Mapping,用于在關(guān)系數(shù)據(jù)庫(kù)和面向?qū)ο?a target="_blank">編程語(yǔ)言的堆之間轉(zhuǎn)換數(shù)據(jù)。這樣就創(chuàng)建了一個(gè)虛擬的對(duì)象數(shù)據(jù)庫(kù),可以從編程語(yǔ)言內(nèi)部使用。
ORM提供了自動(dòng)支持,用于將元組映射到對(duì)象并返回,同時(shí)考慮所有這些差異。問(wèn)題的核心在于將對(duì)象的邏輯表示轉(zhuǎn)換為能夠存儲(chǔ)在數(shù)據(jù)庫(kù)中的原子形式,同時(shí)保留對(duì)象的屬性和它們之間的關(guān)系,以便在需要時(shí)可以重新加載為對(duì)象。如果實(shí)現(xiàn)了這種存儲(chǔ)和檢索功能,則稱這些對(duì)象是持久的。
優(yōu)點(diǎn)
提高開(kāi)發(fā)效率,減少開(kāi)發(fā)成本
使開(kāi)發(fā)更加面向?qū)ο?/p>
可移植性
可以輕松引入額外功能,如數(shù)據(jù)緩存。
加快開(kāi)發(fā)速度 - 消除了重復(fù)的SQL代碼的需要。
減少開(kāi)發(fā)時(shí)間、成本
克服特定于供應(yīng)商的SQL差異 - ORM知道如何編寫特定于供應(yīng)商的SQL
缺點(diǎn)
在學(xué)習(xí)使用ORM時(shí)會(huì)損失生產(chǎn)力
失去了對(duì)代碼實(shí)際執(zhí)行內(nèi)容的理解 - 使用SQL時(shí),開(kāi)發(fā)人員更能控制
ORM有變慢的傾向
ORM無(wú)法與復(fù)雜查詢的SQL查詢競(jìng)爭(zhēng)
Grom介紹
Gorm是一種功能強(qiáng)大且對(duì)開(kāi)發(fā)人員友好的ORM庫(kù),支持主流的數(shù)據(jù)庫(kù)。
GORM 官方支持的數(shù)據(jù)庫(kù)類型有: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工具時(shí),我們需要在代碼中定義模型(Models)與數(shù)據(jù)庫(kù)中的數(shù)據(jù)表進(jìn)行映射,模型是標(biāo)準(zhǔn)的 struct,由 Go 的基本數(shù)據(jù)類型、實(shí)現(xiàn)了Scanner和Valuer接口的自定義類型及其指針或別名組成
約定
GORM 傾向于約定優(yōu)于配置 默認(rèn)情況下,GORM 使用ID作為主鍵,使用結(jié)構(gòu)體名的蛇形復(fù)數(shù)作為表名,字段名的蛇形作為列名,并使用CreatedAt、UpdatedAt字段追蹤創(chuàng)建、更新時(shí)間
如果您遵循 GORM 的約定,您就可以少寫的配置、代碼。如果約定不符合您的實(shí)際要求, GORM 允許你配置它們
gorm.Model
GORM 定義一個(gè)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ù)庫(kù)
+關(guān)注
關(guān)注
7文章
4020瀏覽量
68342 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67504 -
MySQL
+關(guān)注
關(guān)注
1文章
906瀏覽量
29522 -
GitHub
+關(guān)注
關(guān)注
3文章
488瀏覽量
18667
原文標(biāo)題:Go操作數(shù)據(jù)庫(kù)與Gorm講解
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何在Rust中連接和使用MySQL數(shù)據(jù)庫(kù)
labview 連接mysql 數(shù)據(jù)庫(kù)的問(wèn)題
labview連接mysql數(shù)據(jù)庫(kù)失敗,原因何在。
Labview連接Mysql學(xué)習(xí)筆記分享
mysql數(shù)據(jù)導(dǎo)出golang實(shí)現(xiàn)
ESP8266如何連接mysql數(shù)據(jù)庫(kù)
eclipse怎么連接數(shù)據(jù)庫(kù)mysql
適用于MySQL和MariaDB的.NET連接器
適用于MySQL和MariaDB的Python連接器:可靠的MySQL數(shù)據(jù)連接器和數(shù)據(jù)庫(kù)
使用插件將Excel連接到MySQL/MariaDB
從Delphi、C++ Builder和Lazarus連接到MySQL數(shù)據(jù)庫(kù)
如何使用Golang連接MySQL
評(píng)論