在使用 Go语言 开发后端服务时,经常需要将大量数据写入数据库。如果一条一条地执行 INSERT 语句,不仅效率低下,还可能对数据库造成不必要的压力。本文将手把手教你如何利用 database/sql 包实现 Go语言批量插入,提升程序性能,适用于 MySQL、PostgreSQL 等主流数据库。
单条插入的缺点显而易见:
而通过 database/sql批量操作,我们可以将多条记录合并为一次 SQL 执行,显著提升写入速度。
MySQL 支持一条 INSERT 语句插入多行数据,例如:
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com'),('Bob', 'bob@example.com'),('Charlie', 'charlie@example.com'); 在 Go 中,我们可以动态拼接这样的 SQL 语句:
package mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql")type User struct { Name string Email string}func batchInsertUsers(db *sql.DB, users []User) error { if len(users) == 0 { return nil } // 构建占位符和参数列表 valueStrings := make([]string, 0, len(users)) valueArgs := make([]interface{}, 0, len(users)*2) for _, user := range users { valueStrings = append(valueStrings, "(?, ?)") valueArgs = append(valueArgs, user.Name, user.Email) } stmt := fmt.Sprintf("INSERT INTO users (name, email) VALUES %s", StringJoin(valueStrings, ",")) _, err := db.Exec(stmt, valueArgs...) return err}// 辅助函数:拼接字符串切片func StringJoin(elems []string, sep string) string { if len(elems) == 0 { return "" } result := elems[0] for _, elem := range elems[1:] { result += sep + elem } return result} ⚠️ 注意:这种方法虽然高效,但需注意 SQL 注入风险(本例中因使用参数化查询是安全的),且不适用于所有数据库(如 PostgreSQL 对单条 INSERT 的多值支持有限)。
如果你希望代码兼容多种数据库,或单次插入数据量极大(比如上万条),推荐使用事务配合预编译语句(Prepare):
func batchInsertWithTx(db *sql.DB, users []User) error { tx, err := db.Begin() if err != nil { return err } defer func() { if err != nil { tx.Rollback() return } }() stmt, err := tx.Prepare("INSERT INTO users (name, email) VALUES (?, ?)") if err != nil { return err } defer stmt.Close() for _, user := range users { _, err = stmt.Exec(user.Name, user.Email) if err != nil { tx.Rollback() return err } } return tx.Commit()} 这种方式虽然比单条插入快很多(因为只开启一次事务,且复用预编译语句),但性能仍略低于方法一。不过它更安全、更通用,适合对 Go数据库优化有稳定性和可维护性要求的项目。
| 方法 | 适用场景 | 性能 |
|---|---|---|
| 单条插入 | 少量数据 | ★☆☆☆☆ |
| SQL 拼接批量插入 | MySQL,中等数据量(<5000 条) | ★★★★★ |
| 事务 + Prepare | 跨数据库,大数据量 | ★★★★☆ |
掌握 Go高效插入数据 的技巧,不仅能提升应用性能,还能减轻数据库负担。无论你选择哪种方式,都要根据实际业务场景权衡。希望这篇教程能帮助 Go 新手快速上手 database/sql 的批量操作!
关键词回顾:Go语言批量插入、database/sql批量操作、Go数据库优化、Go高效插入数据
本文由主机测评网于2025-12-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025127057.html