golang学习笔记——grom连接mysql

news2024/11/13 21:49:50

GORM 指南

The fantastic ORM library for Golang aims to be developer friendly.
Golang的ORM库旨在对开发人员友好。

特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

安装

创建项目

mkdir test-grom
cd test-grom
# 生成go.mod文件
go mod init gitcode.com/m
# 生成main.go文件,然后粘贴下面例子的代码
touch main.go
# 下载依赖
go mod tidy

输出

go: finding module for package gorm.io/gorm
go: finding module for package gorm.io/driver/mysql
go: found gorm.io/driver/mysql in gorm.io/driver/mysql v1.5.7
go: found gorm.io/gorm in gorm.io/gorm v1.25.11

或者

手动安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

创建数据库

在这里插入图片描述
数据库名称随意填一个,字符集要选择utf8mb4类型。表不用创建,下方的AutoMigrate会自动生成。生产环境禁止使用此方法。

快速入门例子

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	// dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	dsn := "root:ioo7ni4a@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	// 迁移 schema
	db.AutoMigrate(&Product{})

	// Create
	db.Create(&Product{Code: "D42", Price: 100})

	// Read
	var product Product
	db.First(&product, 1)                 // 根据整型主键查找
	db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

	// Update - 将 product 的 price 更新为 200
	db.Model(&product).Update("Price", 200)
	// Update - 更新多个字段
	db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
	db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

	// Delete - 删除 product
	db.Delete(&product, 1)
}

**注意:**想要正确的处理 time.Time ,您需要带上 parseTime 参数, (更多参数) 要支持完整的 UTF-8 编码,您需要将 charset=utf8 更改为 charset=utf8mb4 查看 此文章 获取详情

MySQL 驱动程序提供了 一些高级配置 可以在初始化过程中使用,例如:

db, err := gorm.Open(mysql.New(mysql.Config{
  DSN: "gorm:gorm@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
  DefaultStringSize: 256, // string 类型字段的默认长度
  DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
  DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
  DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
  SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})

AutoMigrate 方法

自动根据提供的模型 (Product) 同步数据库表结构。
如果表不存在,则创建新表。
如果表已存在,会更新表结构以匹配 Product 模型。

使用说明

AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。

注意: AutoMigrate 会创建表、缺失的外键、约束、列和索引。 如果大小、精度、是否为空可以更改,则 AutoMigrate 会改变列的类型。 出于保护您数据的目的,它 不会 删除未使用的列

db.AutoMigrate(&User{})

db.AutoMigrate(&User{}, &Product{}, &Order{})

// 创建表时添加后缀
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

注意 AutoMigrate 会自动创建数据库外键约束,您可以在初始化时禁用此功能,例如:

db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
  DisableForeignKeyConstraintWhenMigrating: true,
})

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

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

相关文章

【Redis】渐进式遍历和数据库管理

渐进式遍历和数据库管理 渐进式遍历scan 数据库管理切换数据库清除数据库 渐进式遍历 Redis 使⽤ scan 命令进⾏渐进式遍历键,进⽽解决直接使⽤ keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历&…

数学建模笔记(三):拟合算法

前面介绍的插值方法,我们可以发现他的特点在于最终得到的曲线一定要经过已经给出的样本点的,而这次要介绍的拟合方法的区别在于,拟合不要求曲线一定要经过所有的样本点,只要这个曲线与样本点之间的误差足够小,距离足够…

unity AssetBundle 使用_什么是AssetBundle_导入必要的插件_创建AssetBundles_AB包资源下载_大文件下载

一、什么是AssetBundle? 定义AssetBundle。 AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系&…

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议,实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求,要求提供不同的电压和电流,充电器接收到请求后,会根据设备的…

数据本地化软件架构-SAAS本地化未来之窗行业应用跨平台架构

一、未来之窗行业应用跨平台架构 未来之窗跨平台架构采用Hybird(混合模式移动应用)是一种结合了原生应用(Native App)和网页应用(Web App)特点的移动应用开发模式。 二、特点 2.1. 开发成本相对较低 - 与…

C++码表之Unicode

今日诗词: 折花逢驿使,寄与陇头人。 江南无所有,聊赠一枝春。 ——《赠范晔诗》【南北朝】陆凯 引言: 上一期我们说到了ASCII码表,这是一种现如今不是那么通用的机制,随着计算机的普及,越来越…

电脑ip地址为什么会自己变更?电脑ip怎么改

在当今这个高度依赖互联网的时代,IP地址作为网络设备的身份标识,其稳定性和可管理性对于网络通信的顺畅至关重要。然而,许多用户可能会遇到电脑IP地址自动变更的情况,这不仅可能影响到网络连接的稳定性,还可能给远程访…

怎么使用win10录屏快捷键 ?分享三款录屏工具

录屏软件在我们日常生活中越来越常见,无论是做教程、记录游戏精彩瞬间还是进行远程教学,一个好的录屏软件都能让我们的生活变得更加便捷。不少人也会选怎win10自带的录屏,使用WIN10 录屏快捷键【winG】,就可以唤出录屏工具&#x…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 ,最简单的办法是使用nvm,就不用手动安装了,那么就得先安装nvm。 NVM 是Node Version Manager,用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm,用户…

Redis | 非关系型数据库Redis的初步认识

本节内容相对理论,着重看基础通用命令这一节 Redis 非关 kv型{字典} 概念应用ubuntu安装配置 windows添加密码 可能问题【ubuntu】远程连接 基础通用命令 ⭐ 概念 特点: 1、开源的,使用C编写,基于内存且支持持久化 2、没有表 支持…

ssrf例题分析

我们第一步先在ubuntu中解压web-ssrfme.zip,更新镜像后重启容器。 我们可以看到代码中成功拉取到ssrfme镜像 ig(preg_match(/file\:\/\/|dict\:\/\/.|\.\.\/|127.0.0.1|localhost/is,$url,$match)) 使用端口访问文件&…

【Linux系列】SH 与 BASH 的区别:深入解析与使用案例

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Leetcode JAVA刷刷站(93)复原IP地址

一、题目概述 二、思路方向 为了解决这个问题,我们可以使用回溯算法。回溯算法在这里非常适用,因为我们需要尝试在字符串中的不同位置插入点(.)来分割出可能的IP地址段,并且需要验证每个段是否满足条件(即…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后,就开始记性系统的设计,系统设计包含总体设计和详细设计。总体设计只是一个大体的设计,经过了总体设计,我们能够划分出系统的一些东西,例如文件、文…

从web.xml动态读取sunspringmvc.xml文件

文章目录 1.问题分析1.SunWebApplicationContext.java 中sunspringmvc.xml是写死的2.但是web.xml已经配置了init-param,所以应该是可以读取的 2.具体实现1.SunDispatcherServlet.java 得到ServletConfig传递给Spring容器完成初始化2.SunWebApplicationContext.java …

C_03 函数学习

函数 优点: 降低代码耦合度降低代码冗余度提高代码复用率提高代码可读性 思想: 封装【包装】 声明: 语法: extern 函数名(形参列表);// 注意:此时 形参列表中变量名可以忽略不写;定义&#xff1…

2024.8.26

一、对于第三模态加入对于模型性能的影响 yes/no other num 尝试通过 1、删去第一次反向传播时第三模态的梯度更新 (1)第三次反向传播会再进行一次更新 (2)阻止模型频繁的学习训练样本 2、取消第三模态共享头部更新时的权重修正&…

Vue.js实战教程:如何一步步构建HSK在线学习平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

3ds Max 2025新增功能、安装教程及下载

3ds Max 2025 引入了一些新的功能和改进,提升了建模、动画和渲染的效率: 增强的建模工具:增加了新的多边形建模和修改器工具,支持更复杂的几何形状和更高效的建模流程。 改进的材质和渲染:引入了新的材质类型和改进的…

05.C++类和对象(下)

1.再探构造函数 • 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表&#xff0c…