基于Go ORM框架的应用开发

本文介绍基于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}