You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:58:33