Golang中应该使用原生SQL还是查询构建器
Golang中应该使用原生SQL还是查询构建器 在构思我的第一个后端项目时,我决定不使用任何框架,主要使用标准库,或者在必要时使用一些库(例如用 Chi 来处理路由)。
我来自 Python 背景(也写过一点 FastAPI),我一直认为查询构建器是一个不错的选择(几乎不算是 ORM)。查看了 Golang 社区和论坛上人们对推荐查询构建器的看法后,我发现“原生 SQL”更受推崇。这是正确的选择吗?
有一个名为 Bob 的 Go 包。它生成用于访问数据库的 Go 代码。我喜欢这种方式,因为你在 IDE 中可以获得自动完成功能,并且基本的 CRUD 操作变得更简单。
更多关于Golang中应该使用原生SQL还是查询构建器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
手写SQL总是一个不错的选择。但如果你想要一个简单的CRUD解决方案,我使用过gorm,它确实让CRUD操作变得轻而易举。它也让扫描数据到结构体变得容易。Chi是一个很棒的路由选择。
听起来你对自己用什么来构建项目已经有了很好的想法。去构建它吧,当遇到更具体的问题时再提问!
查看了Go语言社区和论坛中关于推荐查询构建器的意见,大家普遍更推崇“原生SQL”。这是正确的方向吗?
我既使用过ORM也使用过查询构建器(并非在Go中),我的观点是,只要编写简单的查询,它们都很好用。但是当你必须编写更复杂的查询时,没有什么能比得上原生SQL。
我不使用ORM的主要原因是很难获得帮助,因为特定ORM/查询构建器的用户数量只是原生SQL开发者的一小部分。而StackOverflow是获取原生SQL问题解答的绝佳来源。
在Go中,原生SQL和查询构建器的选择取决于具体场景。原生SQL通常更受推崇,因为它提供了更好的性能、透明度和灵活性,尤其是在复杂查询场景下。以下是一个原生SQL的示例:
// 使用database/sql包执行原生SQL
func GetUserByID(db *sql.DB, id int) (*User, error) {
var user User
query := `SELECT id, name, email FROM users WHERE id = $1`
err := db.QueryRow(query, id).Scan(&user.ID, &user.Name, &user.Email)
if err != nil {
return nil, err
}
return &user, nil
}
对于动态查询条件,可以手动构建SQL语句:
func GetUsers(db *sql.DB, filters map[string]interface{}) ([]User, error) {
query := `SELECT id, name, email FROM users WHERE 1=1`
args := []interface{}{}
if name, ok := filters["name"]; ok {
query += ` AND name = $` + strconv.Itoa(len(args)+1)
args = append(args, name)
}
if email, ok := filters["email"]; ok {
query += ` AND email = $` + strconv.Itoa(len(args)+1)
args = append(args, email)
}
rows, err := db.Query(query, args...)
if err != nil {
return nil, err
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
if err := rows.Scan(&user.ID, &user.Name, &user.Email); err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
查询构建器在简单CRUD操作中可能更便捷,但原生SQL在复杂业务逻辑中更具优势。Go的database/sql包已经提供了良好的基础,结合预处理语句可以有效防止SQL注入。

