在使用 Go语言 开发应用程序时,与数据库交互是常见需求。为了提升性能并防止 SQL注入 等安全问题,database/sql 包提供了强大的 预处理语句(Prepared Statements) 功能。本教程将从零开始,手把手教你如何在 Go 中使用预处理语句,即使是编程小白也能轻松上手!
预处理语句是一种预先编译的 SQL 模板,其中包含占位符(如 ?),在执行时再传入具体参数。这种方式有两大优势:
首先,确保你已安装对应数据库的驱动(如 MySQL 使用 github.com/go-sql-driver/mysql)。以下是一个连接 MySQL 的示例:
package mainimport ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql")func main() { // 数据库连接字符串 dsn := "username:password@tcp(127.0.0.1:3306)/testdb" db, err := sql.Open("mysql", dsn) if err != nil { log.Fatal(err) } defer db.Close() // 验证连接 if err := db.Ping(); err != nil { log.Fatal(err) } fmt.Println("数据库连接成功!")} 假设我们有一个用户表 users,包含 id 和 name 字段。现在我们要根据 ID 查询用户信息:
// 准备预处理语句stmt, err := db.Prepare("SELECT name FROM users WHERE id = ?")if err != nil { log.Fatal(err)}defer stmt.Close() // 别忘了关闭!// 执行查询,传入参数 123var name stringerr = stmt.QueryRow(123).Scan(&name)if err != nil { if err == sql.ErrNoRows { fmt.Println("未找到用户") } else { log.Fatal(err) }} else { fmt.Printf("用户姓名:%s\n", name)} 同样地,我们可以用预处理语句安全地插入新用户:
// 准备插入语句insertStmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)")if err != nil { log.Fatal(err)}defer insertStmt.Close()// 执行插入result, err := insertStmt.Exec("张三", "zhangsan@example.com")if err != nil { log.Fatal(err)}// 获取插入的自增IDlastID, _ := result.LastInsertId()fmt.Printf("新用户ID:%d\n", lastID) 传统拼接 SQL 的方式(如 fmt.Sprintf)极易被攻击。例如:
// ❌ 危险!不要这样做query := fmt.Sprintf("SELECT * FROM users WHERE name = '%s'", userInput) 如果 userInput 是 ' OR '1'='1,整个 SQL 就会被篡改。
而使用 Go语言预处理语句,参数会被数据库驱动自动转义,从根本上杜绝此类风险,这也是 SQL注入防护 的最佳实践之一。
通过本教程,你已经掌握了在 Go语言 中使用 database/sql 包的预处理语句进行安全、高效的 Go数据库操作。记住:永远不要拼接 SQL 字符串,优先使用预处理语句来实现 SQL注入防护。这不仅让你的代码更健壮,也符合现代 Web 开发的安全规范。
赶快在你的项目中试试吧!如有疑问,欢迎在评论区留言交流~
本文由主机测评网于2025-12-27发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251213103.html