基于 SQL+JSON+自定义模板生成代码
2025/5/14大约 4 分钟开发指南jsonsqlcustom template
提示
要求 sponge v1.11.0+ 版本
概述
通过自定义模板和 SQL 的结合生成与表对应的代码(不局限于 go 代码)。只需提供 数据库连接信息 和 模板代码路径两个主要参数即可,支持多表批量生成代码。
适用场景:
- 后端 CRUD 相关代码(例如 api、router、service、dao、model 等)。
- 前端 CRUD 相关的页面代码。
- 各种 ORM 的 CRUD 代码。
前期准备
注
sponge 支持数据库类型 mysql、mongodb、postgresql、sqlite。
下面以 mysql 为例,环境要求:
- 已安装 sponge
- mysql 服务
- mysql 表
固定字段与自定义字段
代码生成功能支持两类字段:
- 固定字段
- 自定义字段
无论是固定字段还是自定义字段,每个字段都是对应模板代码中的占位符。
固定字段:是通过 SQL 自动解析出来不能更改的字段。一个表 teacher 对应的固定字段示例如下:
{
"TableColumnSubMessage": "",
"TableColumnSubStructure": {},
"TableColumns": [
{
"ColumnComment": "",
"ColumnName": "id",
"ColumnNameCamel": "ID",
"ColumnNameCamelFCL": "id",
"GoType": "uint64",
"IsPrimaryKey": true,
"Tag": ""
},
{
"ColumnComment": "用户名",
"ColumnName": "name",
"ColumnNameCamel": "Name",
"ColumnNameCamelFCL": "name",
"GoType": "string",
"IsPrimaryKey": false,
"Tag": ""
}
],
"DBDriver": "mysql",
"TablePrimaryKey": {
"GoType": "uint64",
"GoTypeFCU": "Uint64",
"IsStringType": false,
"Name": "id",
"NameCamel": "ID",
"NameCamelFCL": "id",
"NamePluralCamel": "IDs",
"NamePluralCamelFCL": "ids"
},
"TableComment": "老师",
"TableName": "teacher",
"TableNameCamel": "Teacher",
"TableNameCamelFCL": "teacher",
"TableNamePluralCamel": "Teachers",
"TableNamePluralCamelFCL": "teachers",
"TableNamePrefix": ""
}
自定义字段:自定义字段是可选的,当模板需要时才将自定义字段定义在一个 JSON 文件中。例如,创建一个名为 fields.json
的文件,其内容如下:
{
"ModuleName": "user",
"PackageName": "handler",
"ServerName": "web",
"Port": 8080
}
注意
在自定义字段中,请避免使用下面字段名称,因为它与固定字段的名称冲突。
DBDriver
TablePrimaryKey
TableNamePrefix
TableName
TableNameCamel
TableNameCamelFCL
TableNamePluralCamel
TableNamePluralCamelFCL
TableNameSnake
TableComment
TableColumns
TableColumnSubStructure
TableColumnSubMessage
创建自定义模板代码
模板代码是代码生成的核心,基于 Go 的 text/template
库实现。因此,建议先熟悉其基本语法规则,语法规则很简单,几分钟即可熟悉,点击查看章节:Go text/template 基本语法规则。
模板文件名建议使用变量(如 {{.TableNameCamelFCL}}.go.tmpl
),以避免多表批量生成时的文件名冲突。以下为一个自定义 CRUD 模板代码的示例:
package {{.PackageName}}
import (
"net/http"
"github.com/gorilla/mux"
)
type {{.TableNameCamelFCL}}Handler struct {}
func (h *{{.TableNameCamelFCL}}Handler) Create{{.TableNameCamel}}(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("{{.TableName}} created"))
}
func (h *{{.TableNameCamelFCL}}Handler) Delete{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("{{.TableName}} deleted"))
}
func (h *{{.TableNameCamelFCL}}Handler) Update{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("{{.TableName}} updated"))
}
func (h *{{.TableNameCamelFCL}}Handler) Get{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("{{.TableName}} found"))
}
func (h *{{.TableNameCamelFCL}}Handler) List{{.TableNameCamel}}(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("List of {{.TableName}}"))
}
func Register{{.TableNameCamel}}Routes(r *mux.Router) {
r.HandleFunc("/{{.TableNameCamelFCL}}", Create{{.TableNameCamel}}).Methods("POST")
r.HandleFunc("/{{.TableNameCamelFCL}}/{ {{.PrimaryKey.Name}} }", Delete{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}).Methods("DELETE")
r.HandleFunc("/{{.TableNameCamelFCL}}/{ {{.PrimaryKey.Name}} }", Update{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}).Methods("PUT")
r.HandleFunc("/{{.TableNameCamelFCL}}/{ {{.PrimaryKey.Name}} }", Get{{.TableNameCamel}}By{{.PrimaryKey.NameCamel}}).Methods("GET")
r.HandleFunc("/{{.TableNameCamelFCL}}", List{{.TableNameCamel}}).Methods("GET")
}
将模板文件存放在一个目录(如 template
)中,可以包含多个模板文件和子目录。
生成代码
在终端执行命令sponge run
进入生成代码 UI 界面,具体步骤如下:
- 进入左侧菜单栏【生成自定义代码】 → 【SQL】;
- 填写以下参数(鼠标悬停在参数旁边的问号
?
上可以查看参数说明):- 数据库类型:如
mysql
- 数据库 DSN:如
root:123456@(127.0.0.1:3306)/testdb
- 点击 获取表名,选择一个或多个表;
- 模板目录路径:如
/home/user/template/api/crud
; - 自定义字段 JSON 文件(可选):如
fields.json
。
- 数据库类型:如
- 点击 下载代码 按钮下载生成的代码,如下图所示:

等价命令
sponge template sql --db-driver=mysql --db-dsn=root:123456@(192.168.3.37:3306)/school --db-table=teacher --tpl-dir=/home/user/template/api/crud --fields=fields.json
提示
点击按钮查看模板信息
可以查看字段信息,这些字段信息对应模板的占位符,可以更方便的编写模板代码。