栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

【go-zero】整合Gorm框架 go分布式框架下orm框架集成 go逆向生成sql表(不使用go-zero自带orm)根据环境mod决定是否开启sql日志打印 best practice

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【go-zero】整合Gorm框架 go分布式框架下orm框架集成 go逆向生成sql表(不使用go-zero自带orm)根据环境mod决定是否开启sql日志打印 best practice

1、新建一个 config.yml

新建文件路径在:项目/rpc/etc/ 下
创建一个名称为 config.yml 的文件如下图所示:

「」使用这个符号包裹的信息全部需要用户填入你自己的信息

base:
    is_dev: false
db_info:
    host: 「sql地址」
    port: 3306
    username: 「账户」
    password: 「密码」
    database: 「数据库」
    type: 0
out_dir: ../internal/model
url_tag: json
language: 中 文
db_tag: gorm
user_gorm_model: false
simple: false
is_web_tag: false
is_web_tag_pk_hidden: false
is_foreign_key: true
is_out_sql: false
is_out_func: true
is_gui: true
is_table_name: true
is_null_to_point: false
table_prefix: ""
self_type_define: {}
out_file_name: ""
web_tag_type: 0
table_names: 「表名」
is_column_name: false
is_out_file_by_table_name: false
is_out_page: false


2、安装软件:gormt

生成可以操作生成model的软件

go install github.com/xxjwxc/gormt@master
3、生成model文件 3.1 进入config.yml的文件绝对路径

copy并进入刚才存入config.yml的文件绝对路径

cd /Users/ctra_wl/Desktop/simbaM/simbam-go-email/rpc/etc
3.2 执行 gormt -g

执行

gormt -g

可见如下图所示

直接回车(或者鼠标点击“直接执行”)

3.3 整理生成的文件

处理 xxx_template.go 的文件

修改后会出现爆红,这里细节需要处理一下

处理 xxx_go.go 的文件

这个文件需要你和数据库重新核对一下
建议根据官方文档使用如下三个字段
创建时间、修改时间、逻辑删除

	CreateAt     time.Time      `gorm:"autoCreateTime"`                                   // 创建时间
	UpdateAt     time.Time      `gorm:"autoUpdateTime"`
	DeletedAt    gorm.DeletedAt `gorm:"column:is_del;type:datetime;default:null"`
4、go 逆向生成sql数据库表

在svc文件中,我们加入一段如下代码
(在方法 func NewServiceContext(c config.Config) *ServiceContext 内加入)

	db, err := gorm.Open(mysql.Open(c.Datasource), &gorm.Config{
		NowFunc: func() time.Time {
			return time.Now().Local()
		}})
	if err != nil {
		logx.Error(err)
		os.Exit(1)
	}
	d, err := db.DB()
	if err != nil {
		logx.Error(err)
		os.Exit(1)
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	d.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	d.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	d.SetConnMaxLifetime(time.Hour)
	_ = db.AutoMigrate(model.SysSite{})
	_ = db.AutoMigrate(model.SysUser{})

核心语句:
_ = db.AutoMigrate(model.SysSite{})
_ = db.AutoMigrate(model.SysUser{})
这俩个model对应的就是 model中的生成sql表mapping的go的struct

4.1、操作步骤

我们直接将对应的数据库表删除
然后执行这个rpc项目即可看到数据库直接生成了我们需要的表

4.2、Gorm 主键问题(重要!!!)

这里摘自官方文档的一张图说明主键创建的方式

best practice 如下:

ID           int64          `gorm:"primaryKey;column:id;not null"`

通过反复重试,发现这里primaryKey包括了autoIncrement,而且又和 type 冲突
即使用了 type后autoIncrement自动失效
所以按照上面的方式去创建你得主键吧

5、go-zero中svc配置是否开启数据库sql日志打印

go-zero中所有的rpc服务,会把数据库链接注册进svc中
然而我们需要在测试环境下开启sql日志打印,在生产下关闭

  1. 修改rpc-etc-xx.yaml 文件中加入:Mode: dev
  2. 在svc中添加代码即可


文件路径:/Users/ctra_wl/Desktop/simbaM/simbam-go-rbac/rpc/internal/svc/servicecontext.go
全部代码如下所示:

package svc

import (
	"git-codecommit.xxx.amazonaws.com/xxxx/config"
	"git-codecommit.xxx.amazonaws.com/xxxx/model"
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	"github.com/zeromicro/go-zero/core/logx"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"os"
	"time"
)

type ServiceContext struct {
	Config       config.Config
	CasbinClient *casbin.Enforcer
	SysMenu      *model.SysMenuMgr
}

func NewServiceContext(c config.Config) *ServiceContext {
	db, err := gorm.Open(mysql.Open(c.Datasource), &gorm.Config{
		NowFunc: func() time.Time {
			return time.Now().Local()
		}})
	if err != nil {
		logx.Error(err)
		os.Exit(1)
	}
	d, err := db.DB()
	if err != nil {
		logx.Error(err)
		os.Exit(1)
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	d.SetMaxIdleConns(10)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	d.SetMaxOpenConns(100)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	d.SetConnMaxLifetime(time.Hour)

	//  判断环境是否为生产,开启debug(打印sql)
	if c.Mode != "pro" {
		db = db.Debug()
	}
	return &ServiceContext{
		Config:       c,
		CasbinClient: enforcer,
		SysMenu:      model.SysMenuMg(db),
	}
}

核心代码,含义是如果为配置文件中Mod不为生产就开启 db.Debug() sql日志打印

	if c.Mode != "pro" {
		db = db.Debug()
	}

查看go-zero源码可见,所以我们使用 pro 为生产mod

项目中 etc yaml配置如下:(默认开启的是dev测试)

6、gorm官方文档

最后附上 gorm的官方文档链接大家可以根据需要自行查询
https://gorm.io/docs/index.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944308.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号