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