我使用 https://github.com/99designs/gqlgen 从 graphql 模式生成 golang 代码。我需要能够将 gorm 标签添加到生成的 golang 类型中。为此,我声明了一个自定义 go 标签的指令(在
schema.directives.gql
中):
directive @goTag(
key: String!
value: String
) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION
然后我在 graphql 模式文件中按以下方式使用它:
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")
}
然后我运行代码生成:
go run github.com/99designs/gqlgen generate
,生成的代码包含 gorm 标签,该标签会在“:”字符之后剪切文本:
type Order struct {
Name string `json:"name" gorm:"primaryKey"` // <--- this is correct
Amount Value `json:"amount" gorm:"embedded;embeddedPrefix` // INCORRECT - everything after "embeddedPrefix" is truncated: ":dissolutionAmount_" is missing, including trailing double quote
SubmitterRef string. `json:"submitterRef"`
Submitter Person `json:"submitter" gorm:"foreignKey` // INCORRECT - value in gorm tag is truncated, ": SubmitterRef" is missing
}
事实证明,gqlgen 中在生成 go 标签时存在一个错误,该错误会截断冒号之后的所有内容。有一个 open PR 可以解决这个问题,希望他们尽快解决。
作为一种解决方法(直到代码修复),我可能可以在 go 中创建模型并映射到 gql 配置中的 graphql 类型。