【发布时间】:2021-08-20 10:38:06
【问题描述】:
我正在使用 golang、go_reform、PostgreSQL。我想做的是一个 REST 搜索实用程序,在我遇到条件搜索查询之前一切都很好。这里的“条件”意味着我在一个表中有 10 列要搜索,并且可能有很多组合,所以我不能单独处理它们。我需要的是一个查询构建器,但我不知道如何在 Go 中实现它。目前我有这样的想法,但似乎效率不高
type Query struct {
Id *int64
FirstName *string
MiddleName *string
LastName *string
AreaId *int64
Birthday *time.Time
}
func (table *Query) Find() (*User) {
if table.Id != nil {
idstr := fmt.Sprintf("WHERE Id = %d AND ", table.Id)
}
else idstr := "WHERE "
}
if table.FirstName != "" {
firststr := fmt.Sprintf("FirstName = %s AND", table.FirstName)
}
else firststr := ""
}//and so on
感觉真的很尴尬,所以我想知道是否有更好的方法来确定 Find() 的字段并基于此构建 SQL 查询。 (实际上它以 JSON 形式出现并绑定到Query struct,所以也许有一种没有 struct 的方法)。也可能有 SQL 解决方法,但我认为在没有所有可能列的情况下构建查询会更有效。
编辑:顺便说一句,为了让我的谷歌搜索查询更准确,我发现了一堆与我的问题相关的东西,可能我现在会尝试使用它。对于那些也有兴趣的人: old go playground example
Making dynamic SQL queries to a MySQL DB
gorp package(sn-ps 的东西听起来很有前途)
【问题讨论】:
-
除了编译错误(即elector.FirstName是一个指针,所以不能与字符串比较)之外,这是一个合理的方法。
-
不要使用
fmt动词(字符串中的%d, %s等)来构建查询,您正在为一些 sql 注入做准备。 -
我对 ORM 的看法是,它们使本来很简单的任务变得更容易,而复杂的任务变得不可能。我认为它们是邪恶的,应该始终避免,没有例外。我的观点并不总是受欢迎,但这是我的观点。
-
@PavelNasevich 如果你不介意使用反射,你可以这样做:play.golang.org/p/BlADhht9PwO
-
@EliasVanOotegem:ORM 本身并不是我们所需要的。查询构建器是。 ORM 通常将这些作为特性包含在内,但没有理由需要 ORM 来获得该特性。