308 lines
6.2 KiB
Markdown
308 lines
6.2 KiB
Markdown
# 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` 一键生成
|
||
- 从真实数据库读取列信息
|
||
- 定期重新生成保持同步
|
||
- 配合版本控制管理代码
|
||
|
||
开始使用代码生成器,提升你的开发效率吧!🚀
|