Goweb---Gorm操作Mysql数据库(一)

news2024/11/18 11:46:30
本文重点:

db.AutoMigrate()这个函数的理解:

AutoMigrate是GORM提供的一个方法,用于自动迁移你的模型(即数据库表结构)到数据库中,确保数据库表与你的Go结构体(模型)保持一致。
首先,你需要定义你的模型(结构体),这些结构体将映射到数据库中的表。然后,你可以使用GORM的AutoMigrate方法来自动创建或更新这些表。

AutoMigrate做了什么?

创建表:如果数据库中不存在与模型对应的表,AutoMigrate会创建这个表。
添加缺失的字段:如果表中缺少模型中的某些字段,AutoMigrate会添加这些字段。
修改字段类型(在某些情况下):如果字段类型与模型中的类型不匹配,AutoMigrate会尝试修改字段类型(但请注意,这取决于数据库和GORM版本,某些情况下可能不支持自动修改字段类型)。
不会删除字段:如果模型中的某些字段在表中不存在,AutoMigrate不会从表中删除任何字段。

如果哪个表已存在呢?

当products表已经存在于数据库中时,GORM的AutoMigrate方法会采取不同的行为,具体取决于表的当前状态与你的模型(Go结构体)之间的差异。以下是几种可能的情况:

  1. 无差异:如果products表的结构与你的Product模型完全匹配(包括字段名、字段类型、索引等),AutoMigrate可能不会执行任何操作,因为没有必要进行迁移。
  2. 缺少字段:如果products表中缺少你的Product模型中定义的某些字段,AutoMigrate会尝试向表中添加这些缺失的字段。然而,并非所有数据库都支持在已存在的表中添加新字段,这取决于数据库的类型和版本。
  3. 字段类型不匹配:如果products表中已存在的字段类型与你的Product模型中定义的字段类型不匹配,AutoMigrate的行为将取决于具体的数据库和GORM版本。在某些情况下,它可能会尝试修改字段类型(但通常这并不可行,因为修改已存在的字段类型可能会导致数据丢失或损坏)。在其他情况下,它可能会忽略类型不匹配并继续执行其他迁移操作。
  4. 不会删除字段:无论你的Product模型中是否缺少products表中的某些字段,AutoMigrate都不会从表中删除任何字段。它只负责添加缺失的字段或修改不匹配的类型(在可能的情况下)。
  5. 索引和约束:AutoMigrate还会处理索引和约束。如果Product模型中定义了索引或约束,并且这些索引或约束在products表中不存在,AutoMigrate会尝试创建它们。但是,如果products表中已经存在这些索引或约束,AutoMigrate可能会跳过它们的创建,或者在某些情况下更新它们(尽管更新索引和约束的行为通常比添加新字段更复杂,且不是所有数据库都支持)。
  6. 数据迁移:重要的是要注意,AutoMigrate主要负责表结构的迁移,而不是数据的迁移。如果你需要迁移数据(例如,从旧模型迁移到新模型),你可能需要编写额外的代码来处理这种情况。
  7. 谨慎使用:由于AutoMigrate可能会修改数据库表结构,因此在生产环境中使用时需要特别小心。在将更改应用于生产数据库之前,最好在开发或测试环境中进行测试,以确保迁移操作不会破坏现有数据或导致意外的副作用。

总之,当products表已存在时,GORM的AutoMigrate方法会根据你的模型与表之间的差异来执行相应的迁移操作。但是,它不会删除任何字段或修改现有数据(除了在某些特定情况下可能尝试修改字段类型或索引/约束)。因此,在使用AutoMigrate时需要谨慎,并确保你的模型与数据库表结构保持一致。

package main

import (
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
//定义模型
type User struct {
	ID       uint      `gorm:"primarykey"`
	Name     string    `gorm:"size:255"`
	Age      int       `gorm:"type:int"`
	Birthday time.Time `gorm:"type:date"`
}

func main() {

	dsn := "root:828924@tcp(127.0.0.1:3306)/user?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}
	user := User{
	 	Name:     "jinzhu",
	 	Age:      18,
	 	Birthday: time.Now(),
	 }
	db.AutoMigrate(&User{})
	//插入一条数据
	db.Create(&user)

	//插入多条数据
	users := []User{
		{Name: "jinzhu1", Age: 18, Birthday: time.Now()},
		{Name: "jinzhu2", Age: 18, Birthday: time.Now()},
	}
	db.Create(users)
}

运行效果:

在这里插入图片描述

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

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

相关文章

第十四届蓝桥杯真题Python c组D.平均(持续更新)

博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 【问题描述】 有一个长度为n的数组(n是10的倍数),每个数 …

vscode配置Eslint后保存出现大量波浪线

解决问题:配置代码格式化 快捷键打开设置:ctrlshiftP 输入: format code 选择:

MySQL-数据库约束

1.约束类型 类型说明NOT NULL非空约束 指定非空约束的列不能存储NULL值 DEFAULT默认约束当没有给列赋值时使用的默认值UNIQUE唯一约束指定唯一约束的列每行数据必须有唯一的值PRIMARY KEY主键约束NOT NULL和UNIQUE的结合,可以指定一个列霍多个列,有助于…

qt6 使用QPSQL

qt6 自带pg数据库驱动: pro文件加个说明: 引用位置添加(按需添加,这里我就大致加一下): test code: 理想情况当然是要用pool,这里只是演示调用而已 QSqlError DbTool::testConnection(const QString &…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络(LSTM)来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题,因此在销售额预测这类涉及时…

19款奔驰E300升级新款触摸屏人机交互系统

《19 款奔驰 E300 的科技焕新之旅》 在汽车科技日新月异的时代,19 款奔驰 E300 的车主们为了追求更卓越的驾驶体验,纷纷选择对爱车进行升级改装,其中新款触摸屏人机交互系统的改装成为了热门之选。 19 款奔驰 E300 作为一款经典车型&#x…

Vue和axios零基础学习

Vue的配置与项目创建 在这之前要先安装nodejs 安装脚手架 官网 Home | Vue CLI (vuejs.org) 先运行,切换成淘宝镜像源,安装速度更快 npm config set registry http://registry.npm.taobao.org 创建项目 用编译器打开一个空文件,在终端输入…

DMA的原理

一、介绍 DMA(Direct Memory Access)是一种允许设备直接与内存进行数据交换的技术,无需‌CPU干预。DMA的主要功能是提供在‌外设和存储器之间或者存储器和存储器之间的高速数据传输。比如使用ADC进行数据采集,可以直接将数据存入…

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…

GAMES101(21~22节,动画和仿真)

Animation 关键帧 动画和几何(曲线)相关 物理模拟/仿真 牛顿第二定律:F ma 需要清楚网格间相互作用力,也需要把物理仿真和渲染分为两部来看,例如布料模拟,流体模拟 mass spring system质点弹簧系统 …

Nest.js实现一个简单的聊天室

本文将介绍如何使用 Nest.js 和 Uni-app 实现一个简单的实时聊天应用。后端使用 nestjs/websockets 和 socket.io,前端使用 uni-app 并集成 socket.io-client。这个项目允许多个用户同时加入聊天并实时交换消息。 效果图: 一、准备工作 安装 Node.js 和…

数据结构与算法——Java实现 24.中缀表达式转后缀

目录 中缀表达式转后缀表达式 引言 思路 代码 正因为我有能力跨越,考验才会降临 —— 24.9.28 中缀表达式转后缀表达式 引言 Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式,然后编译好输出程序 思路 遍历中缀表达式,如果遇…

电脑学习通看不到课程解决办法

电脑学习通看不到课程解决办法 查看学习通时发现没有课程 解决方法1: 更改单位 具体见:超星学习通关于PC版无法查看课程问题解决 解决方法二:添加应用 添加应用 点击账号管理 点击应用管理 添加应用、添加首页这个应用 添加完成后查看首页就能看到课程了 然后就OK啦、就可…

[JavaEE] HTTP/HTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP发展史 1.3 HTTP工作过程 1.3.1 抓包工具的原理 1.4 HTTP请求格式 1.4.1认识URL 1.5 HTTP响应格式 1.6 认识HTTP"方法"(method) 1.6.1 GET方法 1.6.2 POST方法 1.6.3 其他方法 1.7 GET 与 POST 的区别 1.8 认识…

Centos安装docker(linux安装docker)——超详细小白可操作手把手教程,包好用!!!

🧸本篇博客重在讲解Centos安装docker,经博主多次在不同服务器上测试,极其的稳定,尤其是阿里的服务器,一路复制命令畅通无阻 📜后续会退出ububtu安装docker教程,敬请期待 📜作者首页&…

某客户Oracle RAC无法启动故障快速解决

某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…

Java爬虫:获取SKU详细信息的艺术

在电子商务的世界里,SKU(Stock Keeping Unit,库存单位)是每个商品的唯一标识符,它包含了商品的详细信息,如尺寸、颜色、价格等。对于商家和开发者来说,获取商品的SKU详细信息对于库存管理、订单…

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…

秦巴山区SHP格式矢量范围

‌秦巴山区的shp范围包括河南、湖北、重庆、四川、陕西、甘肃六省市的80个县(市、区)。‌这一区域不仅地理范围广泛,而且生态多样性丰富,是国家重要的生物多样性和水源涵养生态功能区。秦巴山区的地貌类型以山地丘陵为主,间有汉中、安康、商丹…

Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置

由于后边可能要启动多个服务,避免服务之间相互干扰,本课程建议每个服务独立部署到一台主机上,这样做会导致资源占用过多,可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署,而是采用命令行方式部署&#xff…