【问题标题】:I want to check if record exist and if not exist then i want to insert that record to database using golang我想检查记录是否存在,如果不存在,那么我想使用 golang 将该记录插入数据库
【发布时间】:2018-09-02 02:19:12
【问题描述】:
package main

import (
    "database/sql"
    "fmt"

    "github.com/gin-gonic/gin"
)

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.Print(err.Error())
    }
    err = db.Ping()
    if err != nil {
        fmt.Print(err.Error())
    }
    rows, err := db.Query("select sum(usercount) as usercount from ( select count(*) as usercount from category where name = 'construction' union all  select count(*) as usercount from sub_category where name = 'construction'  union all  select count(*) as usercount from industry where name = 'construction' ) as usercounts;")

}

【问题讨论】:

  • 好的,你正在检查它是否存在,用你的SELECT。现在测试结果,如果不存在则INSERT
  • "我想检查记录是否存在,如果不存在,那么我想将该记录插入数据库" MySQL 或多或少地通过INSERT ... SELECT ... WHERE ... 语法dev.mysql.com/doc/refman/5.7/en/insert-select.html 支持这一点跨度>
  • 我不认为你认为的那样;也不是 OP 的要求:“使用 INSERT ... SELECT,您可以从 SELECT 语句的结果中快速将许多行插入到表中”。 OP 想要INSERT IF NOT EXIST,MySql 不支持
  • 相信我@Mawg,INSERT ... SELECT ... WHERE ... 是可能的,我以前做过.. 只有 topicstarter 会分享这个表和示例数据,他已经有了一个 MySQL 唯一的答案。
  • 如果你这么说(而且你有代表)。我生活和学习:-/ stackoverflow.com/questions/1361340/…?

标签: mysql go


【解决方案1】:

一种可能的方法是:

var exists bool
row := db.QueryRow("SELECT EXISTS(SELECT 1 FROM ...)")
if err := row.Scan(&exists); err != nil {
    return err
} else if !exists {
    if err := db.Exec("INSERT ..."); err != nil {
        return err
    }
}

【讨论】:

  • 是什么阻止了值被 SELECT 和 INSERT 之间的另一个操作插入?
  • 没什么,虽然这可能是真正解决方案的必要方面,但在我看来,考虑到 OP 的示例代码,他们的问题更多是关于如何执行这些步骤,如果不存在,则插入,在 Go 中。
  • 很公平,但由于 mysql 有办法在单个查询中执行此操作,这可能就是答案(这与 Go 完全无关)
  • @mkopriva,它显示错误,返回错误。太多类似的论点
  • @waseemkhan 请用返回错误的代码更新您的问题,没有代码我无法知道您到底做错了什么。
【解决方案2】:

首先执行select语句。然后用rows.Next() 检查数据库中是否有记录。如果没有,执行插入查询。

rows, err := db.Query("select sum(usercount) as usercount from ( select count(*) as usercount from category where name = 'construction' union all  select count(*) as usercount from sub_category where name = 'construction'  union all  select count(*) as usercount from industry where name = 'construction' ) as usercounts;")
if err != nil {
    log.Fatal(err)
}

if rows.Next() {
    //exists
} else {
    db.Query("INSERT INTO...")
}

【讨论】:

    【解决方案3】:

    忽略是你的朋友!

    如果您有一个要检查的字段的唯一索引,则可以直接使用一个查询来完成,如下所示:

    INSERT IGNORE .........;
    

    【讨论】:

      【解决方案4】:

      我创建了一个函数,可以用来检查用户记录是否存在, 您可以将其重新用于其他表格

      
      func userWithFieldExists(field string, value string) bool {
          var count int64
          if err := config.DB.Model(&User{}).Select("id").Where(fmt.Sprintf("%s = ?", field), value).Count(&count).Error; err != nil {
              log.Errorf("unable to retrieved user: %v", err)
              return false
          }
          if count > 0 {
              return true
          }
          return false
      }
      

      可以这样使用:

      userWithFieldExists("email", user.Email)
      

      【讨论】:

        猜你喜欢
        • 2012-05-09
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 2021-07-31
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多