创建 model.mk 文件用于外部Makefile引用,或者改名为Makefile直接使用
# 变量默认值,只有变量未被外部定义时才赋值
DB_DSN ?= user:pass@tcp(localhost:3306)/dbname
# 输出目录,默认为当前目录
OUTPUT_DIR ?= .
# 表前缀,用于去除文件名以及结构体与函数中的小写表前缀
TABLE_PREFIX ?= zp
# 表前缀,用于去除文件名以及结构体与函数中的大写表前缀
OLD_PREFIX ?= Zp
# 表名,多个表名用逗号分隔,用于生成模型, *为所有表
TABLE ?= zp_user,zp_user_xx
# 表中需要过滤的列名(在执行插入或者更新操作时会忽略某些字段的赋值),多个列名用逗号分隔
IGNORE_COLUMNS ?=
.PHONY: gen-model fix-names clean-model clean-gen
# 生成模型 & 修复命名
gen-model:
goctl model mysql datasource \
-url="$(DB_DSN)" \
-dir="$(OUTPUT_DIR)" \
-c=true \
--table="$(TABLE)" \
$(if $(strip $(IGNORE_COLUMNS)),-i="$(IGNORE_COLUMNS)")
$(MAKE) fix-names
# 修复命名中的前缀(文件名、结构体、函数)
fix-names:
@echo "🛠 正在移除前缀 $(TABLE_PREFIX)/$(OLD_PREFIX)..."
@for file in $(TABLE_PREFIX)*.go; do \
base=$$(basename $$file); \
newbase=$$(echo $$base | sed "s/^$(TABLE_PREFIX)//"); \
newfile="$(OUTPUT_DIR)/$$newbase"; \
mv "$$file" "$$newfile"; \
oldstruct=$$(echo $$base | sed -E 's/Model.go$$//' | sed -E 's/(^|_)([a-z])/\U\2/g'); \
newstruct=$$(echo $$newbase | sed -E 's/Model.go$$//' | sed -E 's/(^|_)([a-z])/\U\2/g'); \
sed -i -E "s/\b$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/\1/g" "$$newfile"; \
sed -i -E "s/\b$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/\L\1/g" "$$newfile"; \
sed -i -E "s/\bdefault$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/default\1/g" "$$newfile"; \
sed -i -E "s/\bdefault$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/default\L\1/g" "$$newfile"; \
sed -i -E "s/\bcustom$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/custom\1/g" "$$newfile"; \
sed -i -E "s/\bcustom$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/custom\L\1/g" "$$newfile"; \
sed -i -E "s/\bNew$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/New\1/g" "$$newfile"; \
sed -i -E "s/\bnew$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/new\1/g" "$$newfile"; \
sed -i "s/\b$$oldstruct\b/$$newstruct/g" "$$newfile"; \
sed -i "s/\bNew$$oldstruct\b/New$$newstruct/g" "$$newfile"; \
echo "✔ 处理完成:$$file → $$newfile"; \
done
# 清理模型
clean-model:
@echo "🧹 正在删除所有包含 'model' 的 .go 文件..."
@find . -maxdepth 1 -type f -name '*model*.go' -exec rm -v {} +
# 清理模型
clean-gen:
@echo "🧹 正在删除所有包含 'model_gen' 的 .go 文件..."
@find . -maxdepth 1 -type f -name '*model_gen*.go' -exec rm -v {} +
Makefile 引用方法
include ./model.mk
DB_DSN = user:pass@tcp(localhost:3306)/dbname
#OUTPUT_DIR = .
#TABLE_PREFIX = zp
#OLD_PREFIX = Zp
TABLE = *