Go语言实战案例-创建模型并自动迁移

在现代 Web 开发中,数据库操作是核心环节之一。传统方式下我们需要手动创建表结构,但这不仅繁琐,还容易出错。Go 语言常用的 ORM 框架 GORM 提供了自动迁移功能,可以根据定义的模型结构自动创建或更新数据库表,大大提升开发效率。

本文将带你一步步实现 在 Go 中定义模型并使用 GORM 自动迁移数据库表


一、环境准备

在开始之前,请确保你已经准备好以下环境:

  • Go 1.18+
  • MySQL 或 SQLite(演示中使用 MySQL)
  • GORM v2

安装 GORM 及 MySQL 驱动:

bash 复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

二、定义数据库模型

在 GORM 中,模型(Model)就是一个 Go 结构体,它会与数据库中的表一一对应。

比如我们定义一个 User 模型:

go 复制代码
package main

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

// User 用户模型
type User struct {
	ID       uint   `gorm:"primaryKey"` // 主键
	Name     string `gorm:"size:100"`   // 用户名,最大长度100
	Email    string `gorm:"unique"`     // 邮箱,唯一
	Age      int    // 年龄
	Password string `gorm:"size:255"`   // 密码
}

func main() {
	// 数据库连接字符串
	dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatal("数据库连接失败: ", err)
	}

	// 自动迁移
	err = db.AutoMigrate(&User{})
	if err != nil {
		log.Fatal("自动迁移失败: ", err)
	}

	log.Println("数据库迁移成功!")
}

三、运行效果

  1. 运行 go run main.go
  2. 如果数据库 testdb 为空,程序会自动创建 users 表:
sql 复制代码
CREATE TABLE `users` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100),
  `email` varchar(191) UNIQUE,
  `age` int,
  `password` varchar(255),
  PRIMARY KEY (`id`)
);
  1. 下次运行程序时,如果模型发生了变化,GORM 会自动更新表结构。

四、自动迁移的注意事项

  • 只会新增字段/索引:不会删除已有字段,避免误删数据。
  • 适合开发阶段使用 :生产环境建议使用数据库迁移工具(如 golang-migrate)进行严格版本管理。
  • 标签控制表结构 :通过结构体标签(gorm:"...")可以精确控制字段属性,例如大小、唯一约束、外键等。

五、总结

通过本案例,我们学习了如何在 Go 中使用 GORM:

  1. 定义模型(结构体 → 数据表)
  2. 使用 AutoMigrate 自动生成数据库表
  3. 灵活利用标签控制字段约束

这大大减少了手动维护 SQL 的工作量,让开发者更专注于业务逻辑。

相关推荐
星栈19 分钟前
用 Rust 写 Agent 服务 -- adk-rust 上手记
后端·agent
杨运交35 分钟前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
LucianaiB1 小时前
我用豆包工作 Seed-2.1-pro,复刻了 QQ 时代爆红的魔术图片
后端
码事漫谈1 小时前
智谱 ZCode 静默上传 Git 历史:48 小时信任危机复盘
后端
掘金码甲哥2 小时前
当对话模型遇上向量模型,vllm production stack 又该如何应对?
后端
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
IT_陈寒2 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
光影少年2 小时前
Express 中间件原理
后端·node.js·express
aramae3 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
徐小夕4 小时前
存量.doc 文档怎么办?JitWord 开源转换库打通旧文档到在线协同全链路
后端·架构·github