【golang】gorm migration建表

package dao

import (
	"fmt"
	"mall/model"
)

func migration() {
	err := _db.Set("grom:table_options", "charset=utf8mb4").
		AutoMigrate(
			&model.User{},
			&model.Address{},
			&model.Admin{},
		)
	if err != nil {
		fmt.Println("err", err)
	}

}
package dao

import (
	"context"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"gorm.io/plugin/dbresolver"
)

var _db *gorm.DB

func Database(connRead, connWrite string) {
	//1.配置日志
	var ormLogger logger.Interface
	if gin.Mode() == "debug" {
		//默认
		ormLogger = logger.Default.LogMode(logger.Info)
	} else {
		ormLogger = logger.Default
	}
	//2.gorm 连接mysql数据库
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       connRead,
		DefaultStringSize:         256,  //string类型字段默认长度
		DisableDatetimePrecision:  true, //进展datatime精度 5.6之前的数据库不支持
		DontSupportRenameIndex:    true, //重命名索引,就要把索引先删掉再重建,mysql5,。7不支持
		DontSupportRenameColumn:   true, //用change重命名索引,mysql 8之前不支持
		SkipInitializeWithVersion: false,
	}), &gorm.Config{
		Logger: ormLogger,
		NamingStrategy: schema.NamingStrategy{
			//命名策略不加s
			SingularTable: true,
		},
	})

	if err != nil {
		return
	}
	sqlDB, _ := db.DB()
	sqlDB.SetMaxOpenConns(20) //设置连接池
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Second * 30)
	_db = db

	//3.主从配置
	_db.Use(dbresolver.
		Register(dbresolver.Config{
			Sources:  []gorm.Dialector{mysql.Open(connWrite)},                       //写
			Replicas: []gorm.Dialector{mysql.Open(connRead), mysql.Open(connWrite)}, //读
			Policy:   dbresolver.RandomPolicy{},
		}))
	migration()
}

func NewDBClient(ctx context.Context) *gorm.DB {
	db := _db
	return db.WithContext(ctx)
}
package conf

import (
	"mall/dao"
	"strings"

	"gopkg.in/go-ini/ini.v1"
)

var (
	AppModel string
	HttpPort string

	Db         string
	DbHost     string
	DbPort     string
	DbUser     string
	DbPassword string
	DbName     string




)

func Init() {
	//本地读取环境变量
	file, err := ini.Load("./conf/config.ini")
	if err != nil {
		panic(err)
	}
	LoadMysql(file)

	//mysql读写分离
	//mysql 读(8) 作为主
	pathRead := strings.Join([]string{DbUser, ":", DbPassword, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8mb4&parseTime=true"}, "")
	//mysql 写(2) 作为从 主从复制
	pathWrite := strings.Join([]string{DbUser, ":", DbPassword, "@tcp(", DbHost, ":", DbPort, ")/", DbName, "?charset=utf8mb4&parseTime=true"}, "")
	//传入dao层
	dao.Database(pathRead, pathWrite)
}



func LoadMysql(file *ini.File) {
	Db = file.Section("mysql").Key("DB").String()
	DbHost = file.Section("mysql").Key("DbHost").String()
	DbPort = file.Section("mysql").Key("DbPort").String()
	DbUser = file.Section("mysql").Key("DbUser").String()
	DbPassword = file.Section("mysql").Key("DbPassword").String()
	DbName = file.Section("mysql").Key("DbName").String()

}

<think>好的,我现在需要回答用户关于GORM自动的问题。首先,我得回忆一下GORM的基本概念,它是一个Go语言的ORM库,用于数据库操作。自动应该是通过模型定义来生成数据库结构的功能。 接下来,我需要确定用户想知道的具体内容。可能包括自动的使用方法、相关标签的作用、迁移过程以及注意事项。我需要分步骤解释这些内容,确保结构清晰。 首先,我应该解释如何通过定义结构体模型,使用GORM的AutoMigrate方法来实现自动。需要提到结构体字段与数据库列的映射规则,比如字段名的蛇形命名法,以及如何通过标签修改列属性,例如指定字段类型、是否为主键、是否允许为空等。 然后,需要说明常用的GORM标签,比如primaryKey、type、not null、unique、default、comment等,这些都是用户在实际使用中可能会用到的。举例说明这些标签如何应用在结构体字段上,帮助用户理解具体用法。 接下来,应该提到自动迁移的流程,包括连接数据库、定义模型、调用AutoMigrate方法,并指出该方法通常用于初始化或开发阶段。同时,要提醒用户在生产环境中谨慎使用,避免意外修改结构导致数据丢失。 注意事项部分也很重要。比如,AutoMigrate只做增量迁移,不会删除列或索引;修改字段类型可能需要手动迁移;复杂的结构可能需要分步迁移或使用原生SQL。这些信息能帮助用户避免常见的问题。 需要检查是否有遗漏的关键点,比如GORM支持的多数据库类型,是否需要在连接时指定数据库驱动,以及结构体与名的对应规则。可能还需要提到TableName方法来自定义名,但用户的问题主要关注,这点可以简单带过。 最后,确保使用中文,避免使用Markdown格式,行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以重点放在结构清晰的中文解释上。同时,保持口语化,让回答易于理解。 总结回答结构:简介自动功能,详细步骤说明如何操作,常用标签介绍,迁移流程,注意事项。这样用户能逐步了解并正确使用GORM的自动功能。</think>GORM的自动功能是通过模型定义自动生成数据库结构的便捷功能。以下是详细使用说明: 一、基础用法 1. 定义模型结构体 ```go type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"type:varchar(100);not null"` Age int Email string `gorm:"uniqueIndex"` CreatedAt time.Time } ``` 2. 执行自动迁移 ```go db.AutoMigrate(&User{}) ``` 执行后会自动创建users名自动转为蛇形复数) 二、核心机制 1. 命名转换规则 - 结构体名 → 名(User → users) - 字段名 → 列名(CreatedAt → created_at) 2. 自动字段处理 - 包含ID字段时自动设为主键 - CreatedAt/UpdatedAt字段自动记录时间 三、常用标签说明 | 标签 | 作用示例 | |-------------------|----------------------------------| | `primaryKey` | 设为主键 | | `type:varchar(50)`| 指定列类型 | | `not null` | 非空约束 | | `uniqueIndex` | 创建唯一索引 | | `default:'guest'` | 设置默认值 | | `comment:'注释'` | 添加列注释 | 四、生产环境议 1. 迁移顺序控制 ```go db.AutoMigrate(&User{}, &Product{}, &Order{}) ``` 议按模型依赖顺序执行迁移 2. 版本化管理 推荐使用迁移工具(如golang-migrate)进行版本控制 五、注意事项 1. 修改字段类型时需先删除旧列: ```go db.Migrator().DropColumn(&User{}, "age") db.AutoMigrate(&User{}) ``` 2. 索引管理: - 使用`index`标签创建普通索引 - 复合索引需在迁移时单独创建: ```go db.Model(&User{}).Index("idx_name_email", "name", "email") ``` 3. 属性设置: ```go func (User) TableOptions() string { return "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值