gin-base/db/generator/README.md

308 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Magic-ORM 代码生成器使用指南
## 📚 什么是代码生成器?
代码生成器可以根据数据库表结构自动生成 Model 和 DAO 代码,大幅提高开发效率。
## 🚀 快速开始
### 1. 创建代码生成器
```go
package main
import (
"git.magicany.cc/black1552/gin-base/db/generator"
)
// 创建代码生成器实例
cg := generator.NewCodeGenerator("./generated")
```
### 2. 定义列信息
```go
columns := []generator.ColumnInfo{
{
ColumnName: "id", // 数据库列名
FieldName: "ID", // Go 字段名(驼峰)
FieldType: "int64", // Go 字段类型
JSONName: "id", // JSON 标签名
IsPrimary: true, // 是否主键
IsNullable: false, // 是否可为空
},
{
ColumnName: "username",
FieldName: "Username",
FieldType: "string",
JSONName: "username",
IsPrimary: false,
IsNullable: false,
},
{
ColumnName: "email",
FieldName: "Email",
FieldType: "string",
JSONName: "email",
IsPrimary: false,
IsNullable: true,
},
{
ColumnName: "created_at",
FieldName: "CreatedAt",
FieldType: "time.Time",
JSONName: "created_at",
},
}
```
### 3. 生成代码
#### 方式一:一键生成(推荐)
```go
// 同时生成 Model 和 DAO
err := cg.GenerateAll("user", columns)
if err != nil {
panic(err)
}
```
#### 方式二:分别生成
```go
// 只生成 Model
err := cg.GenerateModel("user", columns)
// 只生成 DAO
err := cg.GenerateDAO("user", "User")
```
## 📁 生成的文件结构
```
generated/
├── user.go # User Model
├── user_dao.go # User DAO
├── product.go # Product Model
└── product_dao.go # Product DAO
```
## 💡 使用生成的代码
### 导入包
```go
import (
"context"
"git.magicany.cc/black1552/gin-base/db/core"
"git.magicany.cc/black1552/gin-base/db/model"
"your-project/generated"
)
```
### 初始化数据库
```go
db, err := core.AutoConnect(false)
```
### 创建 DAO 实例
```go
userDAO := generated.NewUserDAO(db)
```
### CRUD 操作
```go
// 创建用户
user := &model.User{
Username: "john",
Email: "john@example.com",
}
err = userDAO.Create(context.Background(), user)
// 查询用户
user, err := userDAO.GetByID(context.Background(), 1)
// 更新用户
user.Email = "new@example.com"
err = userDAO.Update(context.Background(), user)
// 删除用户
err = userDAO.Delete(context.Background(), 1)
// 分页查询
users, err := userDAO.FindByPage(context.Background(), 1, 10)
```
## 🔧 API 参考
### NewCodeGenerator
```go
func NewCodeGenerator(outputDir string) *CodeGenerator
```
创建代码生成器实例。
**参数:**
- `outputDir` - 输出目录路径
### GenerateModel
```go
func (cg *CodeGenerator) GenerateModel(tableName string, columns []ColumnInfo) error
```
生成 Model 代码。
**参数:**
- `tableName` - 数据库表名
- `columns` - 列信息数组
### GenerateDAO
```go
func (cg *CodeGenerator) GenerateDAO(tableName string, modelName string) error
```
生成 DAO 代码。
**参数:**
- `tableName` - 数据库表名
- `modelName` - Model 名称(驼峰)
### GenerateAll
```go
func (cg *CodeGenerator) GenerateAll(tableName string, columns []ColumnInfo) error
```
一键生成 Model + DAO推荐
**参数:**
- `tableName` - 数据库表名
- `columns` - 列信息数组
## 📋 ColumnInfo 结构
```go
type ColumnInfo struct {
ColumnName string // 数据库列名(下划线风格)
FieldName string // Go 字段名(驼峰风格)
FieldType string // Go 数据类型
JSONName string // JSON 标签名
IsPrimary bool // 是否主键
IsNullable bool // 是否可为空
}
```
## 🗺️ 类型映射表
| 数据库类型 | Go 类型 |
|-----------|---------|
| INT/BIGINT | int64 |
| VARCHAR/TEXT | string |
| DATETIME | time.Time |
| TIMESTAMP | time.Time |
| BOOLEAN | bool |
| FLOAT/DOUBLE | float64 |
| DECIMAL | string 或 float64 |
## 🎯 最佳实践
### 1. 从数据库读取真实表结构
```go
// 示例:从 MySQL INFORMATION_SCHEMA 获取列信息
query := `
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'your_database'
AND TABLE_NAME = 'your_table'
`
```
### 2. 批量生成所有表
```go
tables := []string{"users", "products", "orders"}
for _, table := range tables {
columns := getColumnsFromDB(table) // 从数据库获取列信息
err := cg.GenerateAll(table, columns)
if err != nil {
log.Printf("生成 %s 失败:%v", table, err)
}
}
```
### 3. 自定义模板
修改 `generator.go` 中的模板字符串,添加自定义方法:
```go
tmpl := `package model
// {{.ModelName}} {{.TableName}} 模型
type {{.ModelName}} struct {
{{range .Columns}}
{{.FieldName}} {{.FieldType}} ` + "`" + `json:"{{.JSONName}}" db:"{{.ColumnName}}"` + "`" + `
{{end}}
}
// 自定义方法
func (m *{{.ModelName}}) Validate() error {
// 验证逻辑
return nil
}
`
```
### 4. 代码审查
- ✅ 检查生成的字段类型是否正确
- ✅ 验证主键和索引设置
- ✅ 添加业务逻辑方法
- ✅ 补充注释和文档
### 5. 版本控制
```bash
# 将生成的代码纳入 Git 管理
git add generated/
git commit -m "feat: 生成用户和产品模块代码"
```
## ⚠️ 注意事项
1. **不要频繁覆盖**: 手动修改的代码可能会被覆盖
2. **代码审查**: 生成的代码需要人工审查
3. **类型映射**: 特殊类型可能需要手动调整
4. **关联关系**: 复杂的模型关联需要手动实现
5. **验证逻辑**: 业务验证逻辑需要手动添加
## 🎉 总结
**优势:**
- 大幅提高开发效率
- 代码规范统一
- 减少重复劳动
- 快速搭建项目骨架
**适用场景:**
- 新项目快速启动
- 数据库表结构变更
- 批量生成基础代码
- 原型开发
**推荐用法:**
- 使用 `GenerateAll` 一键生成
- 从真实数据库读取列信息
- 定期重新生成保持同步
- 配合版本控制管理代码
开始使用代码生成器,提升你的开发效率吧!🚀