全部產品
Search
文件中心

Lindorm:基於Go ORM架構的應用開發

更新時間:Jul 06, 2024

本文介紹基於Go ORM架構串連和使用Lindorm寬表引擎的方法。

前提條件

操作步驟

  1. 在Go專案的go.mod檔案中添加GORM相關依賴。

    require (
        gorm.io/driver/mysql v1.5.1
        gorm.io/gorm v1.25.4
    )
  2. 配置串連參數。

    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資料庫。

  3. 建立串連,通過寬表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}