本文介紹基於Go ORM架構串連和使用Lindorm寬表引擎的方法。
前提條件
已安裝GO環境,建議安裝Go 1.17及以上版本。如何安裝,請參見Go。
已開通MySQL協議相容功能。如何開通,請參見開通MySQL協議相容功能。
已將用戶端IP添加至白名單,具體操作請參見設定白名單。
操作步驟
在Go專案的go.mod檔案中添加GORM相關依賴。
require ( gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.4 )
配置串連參數。
dsn := "<user>:<password>@tcp(<lidnorm_mysql_url>:33060)/<database>"
參數說明
參數
說明
user
如果您忘記使用者密碼,可以通過Lindorm寬表引擎的叢集管理系統修改密碼。具體操作,請參見修改使用者密碼。
password
lidnorm_mysql_url
Lindorm寬表引擎的MySQL相容地址。如何擷取,請參見查看串連地址。
重要如果應用部署在ECS執行個體,建議您通過專用網路訪問Lindorm執行個體,可獲得更高的安全性和更低的網路延遲。
如果應用部署在本地,在通過公網串連Lindorm執行個體前,需在控制台開通公網地址。開通方式:在控制台選擇
,在寬表引擎頁簽單擊開通公網地址。通過專用網路訪問Lindorm執行個體,lidnorm_mysql_url請填寫MySQL相容地址對應的專用網路地址。通過公網訪問Lindorm執行個體,lidnorm_mysql_url請填寫MySQL相容地址對應的公網地址。
database
需要串連的資料庫名稱。預設串連default資料庫。
建立串連,通過寬表SQL文法使用Lindorm寬表引擎。以建立表為例。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } // 重要,Lindorm寬表引擎不支援事務,需要將事務關閉 session := db.Session(&gorm.Session{SkipDefaultTransaction: true}) //建立表Product err = session.Migrator().CreateTable(&Product{}) if err != nil { panic(err) }
完整樣本
完整範例程式碼如下:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
//表映射的對象定義
type Product struct {
//指定ID為primary key, 設定auto increment為false (Lindorm寬表引擎不支援auto increment)
ID int64 `gorm:"primaryKey;autoIncrement:false"`
//String需要映射為varchar類型,否則longtext類型不支援
Code string `gorm:"type:varchar"`
Price float64
}
func main() {
//user是lindorm寬表引擎的使用者名稱
//password是使用者對應的密碼
//lidnorm_mysql_url是lindorm寬表引擎MySQL協議的接入網域名稱
//database是需要串連的資料庫
dsn := "user:test@tcp(ld-uf6k8yqb741t3****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com:33060)/default"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// 重要,Lindorm寬表引擎不支援事務,需要將事務關閉
session := db.Session(&gorm.Session{SkipDefaultTransaction: true})
//建表
err = session.Migrator().CreateTable(&Product{})
if err != nil {
panic(err)
}
//寫入資料1
tx := session.Debug().Create(&Product{ID: 1, Code: "D42", Price: 100.1})
err = tx.Error
if err != nil {
panic(err)
}
//寫入資料2
tx = session.Debug().Create(&Product{ID: 2, Code: "B41", Price: 105.5})
err = tx.Error
if err != nil {
panic(err)
}
var product1 Product
//查詢資料1
session.Debug().First(&product1, 1) // 根據整型主鍵尋找
fmt.Println(product1)
var product2 Product
//查詢資料2
session.Debug().First(&product2, "code = ?", "B41") // 尋找 code 欄位值為 D42 的記錄
fmt.Println(product2)
//更新資料,將id為1的記錄的price更新為101.8
session.Debug().Model(&Product{}).Where("id = ?", 1).Update("price", 101.8)
product1 = Product{}
//查詢資料1
session.Debug().First(&product1, 1)
fmt.Println(product1)
// Delete - 刪除 product1
session.Delete(&Product{}, 1)
product1 = Product{}
session.Debug().First(&product1, 1)
fmt.Println(product1)
}
上述代碼執行後將返回執行日誌,日誌中包含查詢結果。查詢結果如下:
{1 D42 100.1}
{2 B41 105.5}
{1 D42 101.8}
{0 0}