GORM
2025/7/27大约 3 分钟componentgormmysqlpostgresqlsqlite
概述
sgorm
是基于 GORM 封装的数据库组件,在保留 GORM 全部功能的基础上,新增了以下特性:
- 完整的链路追踪支持
- 增强的自定义条件查询功能
数据库配置
在 configs
目录下的 YAML 配置文件中进行数据库设置:
MySQL 配置
# database setting
database:
driver: "mysql"
mysql:
# dsn format, <user>:<pass>@(127.0.0.1:3306)/<db>?[k=v& ......]
dsn: "root:123456@(127.0.0.1:3306)/account?parseTime=true&loc=Local&charset=utf8mb4"
enableLog: true # 是否开启日志
maxIdleConns: 3 # 设置空闲连接池中的最大连接数
maxOpenConns: 100 # 设置打开的数据库连接数上限
connMaxLifetime: 30 # 设置连接可重复使用的最长时间,单位(分)
#slavesDsn: # 设置从 mysql dsn
# - "你的 dsn 1"
# - "你的 dsn 2"
#mastersDsn: # 设置 masters mysql dsn,数组类型,非必填字段,如果只有一个 master,则无需设置 mastersDsn 字段,默认 dsn 字段为 mysql master.
# - "你的 master dsn"
PostgreSQL 配置
# database setting
database:
driver: "postgresql"
postgres:
# dsn format, <username>:<password>@<hostname>:<port>/<db>?[k=v& ......]
dsn: "root:123456@192.168.3.37:5432/account?sslmode=disable"
enableLog: true # 是否开启日志
maxIdleConns: 3 # 设置空闲连接池中的最大连接数
maxOpenConns: 100 # 设置打开的数据库连接数上限
connMaxLifetime: 30 # 设置连接可重复使用的最长时间,单位(分)
SQLite 配置
# database setting
database:
driver: "sqlite"
sqlite:
dbFile: "test/sql/sqlite/sponge.db" # 如果在 Windows 环境中,路径分隔符为\\
enableLog: true # 是否开启日志
maxIdleConns: 3 # 设置空闲连接池中的最大连接数
maxOpenConns: 100 # 设置打开的数据库连接数上限
connMaxLifetime: 30 # 设置连接可重复使用的最长时间,单位(分)
初始化示例
MySQL 初始化
import "github.com/go-dev-frame/sponge/pkg/sgorm/mysql"
var dsn = "root:123456@(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
// case 1: 默认设置
gdb, err := mysql.Init(dsn)
// case 2: 自定义设置
db, err := mysql.Init(
dsn,
mysql.WithLogging(logger.Get()),
mysql.WithLogRequestIDKey("request_id"),
mysql.WithMaxIdleConns(5),
mysql.WithMaxOpenConns(50),
mysql.WithConnMaxLifetime(time.Minute*3),
// mysql.WithSlowThreshold(time.Millisecond*100), // 仅打印执行时间超过100毫秒的日志
// mysql.WithEnableTrace(), // enable tracing
// mysql.WithRWSeparation(SlavesDsn, MastersDsn...) // 读写分离
// mysql.WithGormPlugin(yourPlugin) // 自定义gorm插件
)
if err != nil {
panic("mysql.Init error: " + err.Error())
}
PostgreSQL 初始化
import (
"github.com/go-dev-frame/sponge/pkg/sgorm/postgresql"
"github.com/go-dev-frame/sponge/pkg/utils"
)
func InitPostgresql() {
opts := []postgresql.Option{
postgresql.WithMaxIdleConns(10),
postgresql.WithMaxOpenConns(100),
postgresql.WithConnMaxLifetime(time.Duration(10) * time.Minute),
postgresql.WithLogging(logger.Get()),
postgresql.WithLogRequestIDKey("request_id"),
}
dsn := "root:123456@127.0.0.1:5432/test" // or dsn := "host=127.0.0.1 user=root password=123456 dbname=account port=5432 sslmode=disable TimeZone=Asia/Shanghai"
dsn = utils.AdaptivePostgresqlDsn(dsn)
db, err := postgresql.Init(dsn, opts...)
if err != nil {
panic("postgresql.Init error: " + err.Error())
}
}
SQLite 初始化
import "github.com/go-dev-frame/sponge/pkg/sgorm/sqlite"
func InitSqlite() {
opts := []sqlite.Option{
sqlite.WithMaxIdleConns(10),
sqlite.WithMaxOpenConns(100),
sqlite.WithConnMaxLifetime(time.Duration(10) * time.Minute),
sqlite.WithLogging(logger.Get()),
sqlite.WithLogRequestIDKey("request_id"),
}
dbFile: = "test.db"
db, err := sqlite.Init(dbFile, opts...)
if err != nil {
panic("sqlite.Init error: " + err.Error())
}
}
Gorm 增删改查使用指南
事务示例
func createUser() error {
// 请注意,在事务中时,应使用 tx 作为数据库句柄
tx := db.Begin()
defer func() {
if err := recover(); err != nil { // 在事务执行期间发生 panic 后回滚
tx.Rollback()
fmt.Printf("transaction failed, err = %v\n", err)
}
}()
var err error
if err = tx.Error; err != nil {
return err
}
if err = tx.Where("id = ?", 1).First(table).Error; err != nil {
tx.Rollback()
return err
}
panic("mock panic")
if err = tx.Create(&userExample{Name: "Mr Li", Age: table.Age + 2, Gender: "male"}).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
Model 嵌入示例
package model
import "github.com/go-dev-frame/sponge/pkg/sgorm"
// User object fields mapping table
type User struct {
sgorm.Model `gorm:"embedded"`
Name string `gorm:"type:varchar(40);unique_index;not null" json:"name"`
Age int `gorm:"not null" json:"age"`
Gender string `gorm:"type:varchar(10);not null" json:"gender"`
}
// TableName get table name
func (table *User) TableName() string {
return sgorm.GetTableName(table)
}