Gorm -- 配置连接、Gorm模型及Tag描述

news2024/11/23 21:26:12

文章目录

    • 引入依赖
    • 读取配置文件
    • 配置数据库连接池
    • 定义模型
      • 数据库表信息
      • 创建对应结构体
      • 数据模型中字段的标签属性
        • column
        • serializer
        • primaryKey
        • default
        • autoIncrement / AUTO_INCREMENT
        • embedded / embeddedPrefix
        • autoCreateTime
        • autoUpdateTime
        • -
        • foreignKey / references

引入依赖

go get -u github.com/spf13/viper
go get -u gorm.io/gorm 
go get -u gorm.io/driver/mysql

读取配置文件

配置文件结构如下:
设置了数据库连接信息、最大连接数、最大空闲数这三个配置 。
在这里插入图片描述

package config

import (
	"github.com/spf13/viper"
)

var AppConfig *Config

type Config struct {
	Mysql MysqlConfig `json:"mysql"`
}
/*
* Mysql 相关配置
 */
type MysqlConfig struct {
	Dsn          string `json:"Dsn"`
	MaxIdleConns *int   `json:"MaxIdleConns,omitempty"`
	MaxOpenConns *int   `json:"MaxOpenConns,omitempty"`
}
func LoadConfig() error {
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	//读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		return err
	}
	//将配置文件中的信息读取到结构体中
	if err := viper.Unmarshal(&AppConfig); err != nil {
		return err
	}
	return nil
}

func GetAppConfig() Config {
	return *AppConfig
}

配置数据库连接池

  • 使用连接池,避免频繁创建数据库链接
  • 控制最大连接数和最大空闲数
  • Gorm 默认使用表名复数形式,即若使用 User 结构体,默认对应的表名是 users ,需要配置表名不使用复数形式
package cus_orm

import (
	"mingvvv/config"

	"gorm.io/driver/mysql"
	"gorm.io/gorm/schema"

	"gorm.io/gorm"
)

var db *gorm.DB

func MysqlConnection() *gorm.DB {
	if db == nil {

		config := config.GetAppConfig()

		dsn := &config.Mysql.Dsn
		maxIdleConns := config.Mysql.MaxIdleConns
		maxOpenConns := config.Mysql.MaxOpenConns

		if dsn == nil {
			panic("non mysql dsn")
		}

		dbcreater, err := gorm.Open(mysql.Open(*dsn), &gorm.Config{
			NamingStrategy: schema.NamingStrategy{
				SingularTable: true, //表名不使用复数形式
			},
		})
		db = dbcreater
		if err != nil {
			panic("failed to connect database")
		}

		sqlDb, _ := db.DB()

		if maxIdleConns != nil {
			sqlDb.SetMaxIdleConns(*maxIdleConns) // 设置最大空闲数
		}
		if maxOpenConns != nil {
			sqlDb.SetMaxOpenConns(*maxOpenConns) // 设置最大连接数
		}
	}

	return db
}

定义模型

数据库表信息

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `infant_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '小名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `user_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '描述',
  `json_field` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `user_role` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户ID',
  `role_id` int DEFAULT NULL COMMENT '角色ID\r\n',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

创建对应结构体

type User struct {
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int `gorm:"default:18"`
	UserDesc   string
	JsonField  map[string]string `gorm:"serializer:json"`
	CreateTime time.Time
	UpdateTime time.Time
	UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"` //指定外键
}

type UserRole struct {
	Id     uint `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	UserId uint
	RoleId uint
}

数据模型中字段的标签属性

如上,我们在创建数据模型的时候在字段后面增加一系列 gorm 标签,这些标签将会影响字段在读写时的功能表现。
下面是几种比较常用的标签属性,其余的可以参考官网链接
https://gorm.io/docs/models.html#embedded_struct

column

用来指定结构体中字段对应数据库中哪个字段
例如结构体 User 中指定 Name 对应数据库表中的 name 字段

serializer

指定字段的序列化方式

例如在结构体 User 中有这样一行

JsonField  map[string]string `gorm:"serializer:json"`

表示将结构体中的字典和数据库中的 json 类型做序列化转换。
如果不做序列化,那么我们在新增或读取数据时会爆出异常:

//新增时
[error] unsupported data type: &map[]

primaryKey

指定字段为主键

default

指定字段的默认值

autoIncrement / AUTO_INCREMENT

指定字段为自增
需要注意的是,如果字段设置了 type 标签,autoIncrement 标签要紧跟在 type 标签后设置,否则可能会不生效
例如 gorm:"type:bigint autoIncrement"

embedded / embeddedPrefix

embedded 将结构体中的字段嵌入到当前结构体中 ,embeddedPrefix 在属性前添加前缀

type Desc struct {
	Desc1 string
	Desc2 string
}
type User struct {
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int               `gorm:"default:18"`
	Desc       Desc              `gorm:"embedded;embeddedPrefix:user_"`
}

其中结构体 User 等价于下面的结构体

type User struct {
	Id         uint   `json:"id" gorm:"primary_key;AUTO_INCREMENT"`
	Name       string `gorm:"column:name"`
	InfantName string
	Age        int     `gorm:"default:18"`
	Desc1      string  `gorm:"column:user_desc1"`
	Desc2      string  `gorm:"column:user_desc2"`
}

autoCreateTime

在创建时自动填充当前时间,当字段属性是 int 类型时,将获取当前时间的 unix 时间戳
autoCreateTime:nano 微秒
autoCreateTime:milli 毫秒

autoUpdateTime

在创建或者修改时自动填充当前时间,当字段属性是 int 类型时,将获取当前时间的 unix 时间戳
autoCreateTime:nano 微秒
autoCreateTime:milli 毫秒

-

忽略当前字段

foreignKey / references

设置外键关联

在结构体 User 中的这一行

UserRole   UserRole   `gorm:"foreignKey:UserId;references:Id"`

表示:
user_role 的外键是 user_id,对应 user 表的 id 字段。
从结构体关系上来看就是,UserRole 结构体通过 UserIdUser 结构体的 Id 进行关联。

这种关系会在新增数据时触发关联插入的操作
即,如果插入一条user数据,且结构体中 UserRole 不为零值,那么他也会同时向 user_role 表中插入一条数据,而且会自动填充外键值(user表的Id)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Tesseract OCR与文本智能识别

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

SQL工具性能实测:居然比Navicat还快,数百万行数据导出仅51秒

如今的SQL语言逐渐成为职场人士必备的能力。为了让更多SQL用户有一款免费又好用的SQL工具,麦聪软件于2023年1月初发布了一款Web版SQL工具SQL Studio,一经推广就赢得了众多用户的注册下载。 使用SQL Studio最明显的体验是什么?笔者回访中发现…

Centos系统里运行java的jar包

目前使用springboot开发是嵌入方式的tomcat,不需要单独使用tomcat,那么经常在服务器上运行jar包,这里记录一下在centos7系统里运行jar的方式。在运行之前需要确定centos7系统是否安装了java环境以及配置环境变量,还有jar需要运行的…

Go语言基准测试(benchmark)三部曲之二:内存篇

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Go语言基准测试(benchmark)三部曲》的第二篇,目标是掌握如何用基准测试来观察被测方法的内存分配情况今天除了常规的操作&…

回溯算法章末总结

组合问题的特点 (1)abba 选中a之后,就不再选了 (2)找出所有的组合 (长度可以不相等) 组合问题模板 做回溯题步骤 (0)判断问题类型 (1)树状图 …

【百度 JavaScript API v3.0】LocalSearch 位置检索、Autocomplete 结果提示

地名检索移动到指定坐标 需求 在输入框中搜索,在下拉列表中浮动,右侧出现高亮的列表集。选中之后移动到指定坐标。 技术点 官网地址: JavaScript API - 快速入门 | 百度地图API SDK 开发文档:百度地图JSAPI 3.0类参考 实现 …

Pillow图像处理(PIL.Image类的详细使用)

文章目录Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库(PIL、Pillow、Scikit-image、Opencv)Pillow 官方文档(超详细,超推荐)一、PIL库与Pillow库的区别二、Pillow库(…

Vue3 目录结构

Vue3 目录结构 架构搭建 请确保你的电脑上成功安装 Node.js,本项目使用 Vite 构建工具,需要 Node.js 版本 > 12.0.0。 查看 Node.js 版本: node -v建议将 Node.js 升级到最新的稳定版本: 使用 nvm 安装最新稳定版 Node.js…

使用docker配置mysql主从复制

1.新建主服务器容器实例: docker run -p 3307:3306 --name mysql \ -v /docker/mysql/data:/var/lib/mysql \ -v /docker/mysql/conf:/etc/mysql/conf \ -v /docker/mysql/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 设置容器卷之后&#xf…

Java网络编程之UDP和TCP套接字

文章目录一. 网络编程概述二. UDP网络编程1. UDP套接字2. UDP客户端回显服务器程序2.1 UDP回显服务器2.2 UDP客户端2.3 UDP实现查词典的服务器三. TCP网络编程1. TCP套接字2. TCP客户端回显服务器程序2.1 TCP回显服务器2.2 TCP客户端2.3 解决服务器无法同时出力多个客户端的问题…

牛客专访ChatGPT:2023校园招聘如何做?附校招趋势

春招在即,牛客作为新一代数智化校园招聘引领者,为大家采访了当下“顶流ChatGPT”,关于近几年校园招聘的变化及2023企业做校招的建议。以下,为“ChatGPT专访”实录。01. ChatGPT眼中近3年校园招聘的变化牛客:很高兴作为…

Unity Material详解

一、创建 二、属性 1.Shader:Unity内置了一些shader,用户自定义的shader也在这里出现. Edit: 可以编辑一些shader可编辑的内容,如一些属性. 2.Rendering Mode:渲染模式 Opaque-不透明-石头适用于所有的不透明的物体Cutout-镂空-破布透明度只有0%和100…

go语言环境配置 项目启动

一 安装go语言 go语言各个版本之间兼容性比较差。所以可能你需要安装固定的版本 1 安装最新版的go brew install go2 查看go可以安装的版本 brew search go3 安装指定版本的go brew install go1.134 查看安装的go语言的版本 go version5 查看go的安装路径 which go || w…

【软件测试】稳定性测试怎么做,这篇文章彻底讲透了~

稳定性对产品的重要性不言而喻。 而作为质量保障,在稳定性测试方面的探索也在不断演化。记得两年前我们做稳定性测试还是基于恒定的压力,7*24小时长时间运行,关注的指标无非是吞吐量TPS的抖动、响应时间的变化趋势,以及各种资源是…

《机器学习系统:设计和实现》读后感和一些思考

目录 计算图、编译器前端、编译器后端 计算图 计算图的作用 计算图的组成 静态计算图与动态计算图 编译器前端 IR中间表示 机器学习框架的中间表示 常见编译器前端优化方法 编译器后端 概述 通用硬件优化:算子拆分和算子融合 算子信息 数据精度和存储…

opencv访问图像(MAT)的属性

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

设计模式:装饰模式

1、装饰模式 1)定义 动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。 2)动机&…

Harbor安装部署实战详细手册

文章目录前言一、安装docker二、安装docker-compose1.下载2.赋权3.测试三、安装harbor1.下载2.解压3.修改配置文件4.部署5.配置开机自启动6.登录验证7.补充说明四、harbor使用问题1.docker login问题:Error response from daemon: Get https://: http: server gave …

Ubuntu 安装 Qt5.7.0

下载 地址:https://download.qt.io/https://download.qt.io/ 文件夹说明: snapshots:预览版,该文件夹中包含最新的测试版本。 online:在线安装包。 official_releases:最终发布版。 new_archive&#…

netcore构建webservice以及调用的完整流程

目录构建前置准备编写服务挂载服务处理SoapHeader调用添加服务调用服务补充内容构建 前置准备 框架版本要求:netcore3.1以上 引入nuget包 SoapCore 编写服务 1.编写服务接口 示例 using System.ServiceModel;namespace Services;[ServiceContract(Namespace &…