Golang中应该使用原生SQL还是查询构建器

Golang中应该使用原生SQL还是查询构建器 在构思我的第一个后端项目时,我决定不使用任何框架,主要使用标准库,或者在必要时使用一些库(例如用 Chi 来处理路由)。

我来自 Python 背景(也写过一点 FastAPI),我一直认为查询构建器是一个不错的选择(几乎不算是 ORM)。查看了 Golang 社区和论坛上人们对推荐查询构建器的看法后,我发现“原生 SQL”更受推崇。这是正确的选择吗?

4 回复

有一个名为 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注入。

回到顶部