gorm简介

【1】ORM:
即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它们就可以了。

【2】GORM
gorm是go语言的一个orm框架,Golang写的,开发人员友好的ORM库。

【3】中文文档:
https://gorm.io/zh_CN/docs/

【4】安装GORM:
录入安装GORM的命令

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


案列:
【1】创建一个数据库:testgorm

package main

import (
	"fmt"
	"gorm.io/driver/mysql" //引入mysql驱动
	"gorm.io/gorm"
)

func main() {

	//连接数据库:
	//参数:指的是数据库的设置信息:用户名:密码@tcp(ip:port)/数据库名字?charset=utf8&parseTime=True&loc=Local
	//charset=utf8设置字符集
	//parseTime=True为了处理time.Time
	//loc=Local时区设置,与本地时区保持一致
	dsn := "root:root@tcp(127.0.0.1:3306)/testgorm?charset=utf8&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err) //如果出错,后续代码没有必要执行,想让程序中断,panic来执行即可
	}

	//创建表方式一:通常情况下,数据库中新建的表的名字是结构体名字的复数形式,例如结构体User,表名users
	if err := db.AutoMigrate(&User{}); err != nil {
		panic(err)
	}
	//创建表方式二:Table方法可以指定你要创建的数据库的表名
	if err := db.Table("user").AutoMigrate(&User{}); err != nil {
		panic(err)
	}

	//删除表
	if !db.Migrator().HasTable(&User{}) {
		fmt.Println("table does not exist")
	} else {
		if err := db.Migrator().DropTable(&User{}); err != nil {
			panic(err)
		}
	}


}

// 定义结构体
type User struct {
	Age  int
	Name string
}

【2】表名自定义规则

//【1】模型名称和表名的映射规则:
//1、如果模型名没有驼峰命名,那么表名就是:模型名小写+复数形式:如模型名User---》表名users
//2、如果模型名有驼峰命名,那么表名就是:大写变小写并在前面加下划线,最后加复数形式:如模型名UserInfo---》表名user_infos
//3、如果模型名有连续的大写字母,那么表名就是:连续的大写字母变小写,驼峰前加下划线,字母变小写,最后加复数形式:如模型名:DBUserInfo---》表名db_user_infos
type User struct {
	Age  int
	Name string
}


type MyUser struct {
	Age  int
	Name string
}

//自定义表名
func (MyUser) TableName() string {
	return "test_my_user"
}

【3】gorm.Model匿名字段

只需要再自己的模型中指定gorm.Model匿名字段,即可在数据库表中包含四个字段:ID,CreatedAt,UpdatedAt,DeletedAt
ID:主键自增长
CreatedAt:用于存储记录的创建时间
UpdatedAt:用于存储记录的修改时间
DeletedAt:用于存储记录的删除时间
代码:

type MyUser2 struct {
	gorm.Model
	Age  int
	Name string
}

【4】通过结构体标签gorm来实现表的约束 

(1)-: 忽略,不映射这个字段 eg:gorm:"”,适合:一些冗余字段,不想在数据库中体现,只想在结构体中体现

(2)primary key:主键eg:gorm:"primary key
(3)AUTO INCREMENT:自增 eg:`gorm:"AUTO INCREMENT"

(4)not null:不为空,默认为空 eg:gorm:"not null"
(5)index:索引,eg:gorm:"index"
创建索引并命名:eg:gorm:"index:idx name_code"

(6)unique index:唯一索引 eg:`gorm:"unique index"唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

(7)unique:唯-eg:gorm:"unique"

(8)column:指定列名eg:`gorm:"column:user name

(9)size:字符串长度,默认为255 eg:gorm:"size:10"`
(10)default`default:'男”默认值
(11)type:设置sql类型 eg:gorm:"type:int(2)"
PS:多个属性值之间用分号分隔

代码:

type Student struct {
	StuID   int    `gorm:"primary_key;AUTO_INCREMENT"`
	Name    string `gorm:"not null"`
	Age     int    `gorm:"unique_index"` //`gorm:"index:name_index"`
	Email   string `gorm:"unique"`
	Sex     string `gorm:"column:gender;size:10"`
	Desc    string `gorm:"-"`
	Classno string `gorm:"type:int"`
}

<think> 我们正在处理一个关于gorm gen的查询。用户希望获得关于gorm gen的详细介绍及使用方法,包括使用指南、功能介绍、最佳实践等。 根据提供的引用,我们可以总结如下: 引用[1]: gorm.io/gen是GORM的一个代码生成工具,用于生成基于GORM的数据库操作代码,可以自动生成模型、查询方法以及CRUD操作代码。 引用[2]: 提供了一个Go-GORM Gen项目的目录结构,其中包含示例、主文件、模块文件等。 引用[3]: 介绍了如何自定义方法和表名。 因此,我们应该组织回答内容,包括: 1. gorm gen是什么(简介) 2. 安装方法 3. 基本使用(如何生成代码) 4. 目录结构说明(可选,因为引用[2]提供了目录结构) 5. 自定义方法(如自定义表名、自定义方法) 6. 最佳实践(可以根据我们已知的知识或引用中的信息进行补充) 注意:回答中要使用中文,数学表达式按照要求使用$...$或$$...$$,但由于本主题可能不涉及数学公式,所以重点在代码和文字描述。 由于用户要求生成相关问题,我们将在最后添加相关问题。 另外,注意引用标识:在引用的地方添加[^1]、[^2]等,但我们这里引用的内容来自用户提供的引用,所以我们可以这样标记: 例如,在提到安装时,可以引用[1];在提到目录结构时,可以引用[2];在自定义方法时,可以引用[3]。 但请注意,用户提供的引用并不是真正的参考文献,而是模拟的引用,因此我们按照用户提供的引用编号进行引用。 接下来,我们按照结构回答。 </think> ### GORM Gen 详细介绍及使用指南 #### 一、核心概念 GORM Gen 是 GORM 官方推出的代码生成工具([^1]),通过自动生成类型安全的 ORM 代码,显著提升数据库操作效率。其核心优势包括: 1. **自动化生成**:自动创建模型结构体、CRUD 方法及查询构造器 2. **类型安全**:基于 Go 结构体生成代码,避免运行时错误 3. **多数据库支持**:兼容 MySQL、PostgreSQL、SQL Server 等多种数据库 4. **动态 SQL**:支持类似 MyBatis 的动态 SQL 生成 #### 二、基础使用流程 **1. 安装** ```bash go get -u gorm.io/gen ``` **2. 初始化生成器**(示例) ```go package main import ( "gorm.io/gen" "gorm.io/driver/mysql" ) func main() { g := gen.NewGenerator(gen.Config{ OutPath: "./dao", // 生成代码输出目录 }) // 连接数据库 dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4" gormDB, _ := gorm.Open(mysql.Open(dsn)) g.UseDB(gormDB) // 绑定数据库连接 // 自动生成模型(根据数据库表结构) g.GenerateModel("users") g.GenerateModelAs("products", "Product") // 执行生成 g.Execute() } ``` **3. 目录结构**([^2]) ``` gen/ ├── dao/ # 生成的DAO层代码 │ ├── user.gen.go # 用户模型操作 │ └── product.gen.go ├── model/ # 模型定义 │ ├── user.go │ └── product.go ├── query/ # 查询构造器 └── gen.go # 生成器入口文件 ``` #### 三、高级功能 **1. 自定义表名**([^3]) ```go // 在模型文件中添加方法 func (User) TableName() string { return "custom_user_table" } ``` **2. 自定义方法** ```go // 在 DAO 文件中扩展 type UserMethod struct { // 继承生成的基类 *gen.UserQuery } // 自定义查询方法 func (m *UserMethod) FindActiveUsers() ([]*model.User, error) { return m.Where(m.Status.Eq(1)).Find() } ``` **3. 动态 SQL** ```go // 使用条件构造器 users, err := query.User.Where( query.User.Age.Gt(18), query.User.Name.Like("%张%"), ).Order(query.User.CreatedAt.Desc()).Find() ``` #### 四、最佳实践 1. **分层设计** - 模型层:`model/` 目录存放纯结构体定义 - 数据层:`dao/` 目录包含 CRUD 操作 - 服务层:调用 DAO 实现业务逻辑 2. **增量生成** ```go // 配置生成策略 g.ApplyBasic(g.GenerateModel("orders", gen.FieldIgnore("deleted_at"))) ``` 3. **事务处理** ```go tx := query.Begin() if err := tx.User.Create(&user); err != nil { tx.Rollback() } tx.Commit() ``` 4. **性能优化** - 启用预编译语句缓存 - 使用 `Select()` 限制查询字段 - 批量操作使用 `CreateInBatches`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值