如何使用Golang实现记录存在性校验及不存在时插入数据库
实现Golang检查数据库记录并插入的完整方案
我来帮你完善这段代码,实现检查指定记录是否存在、不存在则插入的功能。你的现有代码已经完成了数据库连接和基础查询,但还需要处理查询结果、补充插入逻辑,下面是完整的实现方案:
1. 核心思路梳理
我们的目标是:
- 查询
category、sub_category、industry三个表中是否存在名为construction的记录 - 若三个表中都没有该记录,则执行插入操作(这里以插入到
category表为例,你可按需调整)
2. 完善后的完整代码
package main import ( "database/sql" "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" // 必须导入MySQL驱动,否则无法识别驱动类型 ) func main() { router := gin.New() router.Use(gin.Logger()) router.Use(gin.Recovery()) // 建立数据库连接 db, err := sql.Open("mysql", "root:password@tcp(gpstest.cksiqniek8yk.ap-south-1.rds.amazonaws.com:3306)/tech") if err != nil { fmt.Printf("数据库连接失败: %v\n", err.Error()) return } defer db.Close() // 程序退出前自动关闭连接,避免资源泄漏 // 验证连接有效性 err = db.Ping() if err != nil { fmt.Printf("数据库心跳检测失败: %v\n", err.Error()) return } fmt.Println("数据库连接成功") // 参数化查询:统计目标记录总数(避免SQL注入风险) var totalCount int querySQL := ` SELECT SUM(usercount) AS usercount FROM ( SELECT COUNT(*) AS usercount FROM category WHERE name = ? UNION ALL SELECT COUNT(*) AS usercount FROM sub_category WHERE name = ? UNION ALL SELECT COUNT(*) AS usercount FROM industry WHERE name = ? ) AS usercounts; ` // 执行查询并读取结果 err = db.QueryRow(querySQL, "construction", "construction", "construction").Scan(&totalCount) if err != nil { fmt.Printf("查询记录总数失败: %v\n", err.Error()) return } // 判断是否需要插入记录 if totalCount == 0 { // 这里以插入到category表为例,可根据需求修改表名、字段和参数 insertSQL := "INSERT INTO category(name) VALUES(?)" result, err := db.Exec(insertSQL, "construction") if err != nil { fmt.Printf("插入记录失败: %v\n", err.Error()) return } insertedID, _ := result.LastInsertId() fmt.Printf("记录不存在,已成功插入,插入ID: %d\n", insertedID) } else { fmt.Println("目标记录已存在,无需执行插入操作") } }
关键注意事项
- 驱动导入:必须添加
_ "github.com/go-sql-driver/mysql",否则会报错unknown driver "mysql" - 参数化查询:所有动态传入的值都要用参数占位符
?,绝对不要直接拼接SQL字符串,防止SQL注入 - 连接关闭:用
defer db.Close()确保程序退出时释放数据库连接,避免资源浪费 - 错误处理:每个数据库操作后都要检查错误,保证程序的健壮性
- 插入逻辑调整:如果需要插入到其他表或添加更多字段,只需要修改
insertSQL和对应的参数即可
内容的提问来源于stack exchange,提问作者waseem khan
相关产品推荐
相关产品推荐

