GqlGen生成含冒号的Go Tag指令值时出现截断问题
解决gqlgen生成Gorm标签时冒号后内容被截断的问题
问题重现
使用gqlgen从GraphQL Schema生成Go代码时,通过自定义@goTag指令为字段添加Gorm标签,当标签值包含冒号(如embeddedPrefix:dissolutionAmount_、foreignKey:SubmitterRef)时,生成的代码会截断冒号后的内容,导致标签不完整:
自定义指令定义(schema.directives.gql)
directive @goTag( key: String! value: String ) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
Schema使用示例
type Value { value: Float! unit: String! } type Order { name: String! @goTag(key: "gorm", value: "primaryKey") amount: Value! @goTag(key: "gorm", value: "embedded;embeddedPrefix:dissolutionAmount_") submitterRef: String! submitter: Person! @goTag(key: "gorm", value: "foreignKey: SubmitterRef") }
错误生成结果
type Order struct { Name string `json:"name" gorm:"primaryKey"` // 正常 Amount Value `json:"amount" gorm:"embedded;embeddedPrefix` // 截断了":dissolutionAmount_" SubmitterRef string `json:"submitterRef"` Submitter Person `json:"submitter" gorm:"foreignKey` // 截断了": SubmitterRef" }
解决方案
方案1:通过gqlgen配置文件直接指定标签(推荐)
绕过@goTag指令的问题,在gqlgen.yml配置文件中为目标字段直接设置Gorm标签,这种方式更可靠:
# gqlgen.yml models: Order: fields: Name: tags: gorm: "primaryKey" Amount: tags: gorm: "embedded;embeddedPrefix:dissolutionAmount_" Submitter: tags: gorm: "foreignKey:SubmitterRef"
配置完成后重新执行生成命令:
go run github.com/99designs/gqlgen generate
生成的代码会正确包含完整的Gorm标签:
type Order struct { Name string `json:"name" gorm:"primaryKey"` Amount Value `json:"amount" gorm:"embedded;embeddedPrefix:dissolutionAmount_"` SubmitterRef string `json:"submitterRef"` Submitter Person `json:"submitter" gorm:"foreignKey:SubmitterRef"` }
方案2:自定义gqlgen模板修复标签生成逻辑
如果必须使用@goTag指令,可以修改gqlgen的模板文件,确保包含冒号的标签值被正确处理:
- 复制gqlgen默认的
model.tmpl模板文件到本地项目目录(如templates/model.tmpl)。 - 找到模板中处理标签的代码段,修改逻辑,避免将标签值内的冒号视为分隔符,改为直接拼接完整的value字符串。
- 在
gqlgen.yml中指定自定义模板路径:
# gqlgen.yml template: - templates/model.tmpl
- 重新执行生成命令即可得到正确的标签。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

