【问题标题】:Gorm "Insert Ignore"戈姆“插入忽略”
【发布时间】:2020-12-08 06:55:51
【问题描述】:

我正在尝试在 GORM 中实现“插入忽略”。我尝试了Create(),但找不到添加Ignore 的方法。我也试过Clause in Gorm

DB.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&user)`.

但是,我收到一条错误消息,显示为 Clauses undefined (type *"github.com/jinzhu/gorm".DB has no field or method Clauses)

我也尝试使用DB.Raw(),但我不知道如何每次更改表,因为我的数据库中有很多表。例如

DB.Raw("INSERT IGNORE INTO A/B/C/.. ... ...")`. 

我有很多表会通过这个函数,每次我可能会插入到不同的表中。

我想知道是否有人在 GORM 中有使用 Insert Ignore 的经验。谢谢!

【问题讨论】:

  • @ttrasn for GORM SO 标签是go-gorm,请在编辑时尝试更新标签:)
  • @Rono 是的,当然 ;)

标签: database go insert go-gorm


【解决方案1】:

您好,欢迎来到 StackOverflow。

我认为您正在使用gorm v1。但是您需要的代码在gorm v2

首先,您必须通过在终端上运行此命令来获取Gorm v2MySQL dialector

go get -u gorm.io/gorm // get gorm v2
go get -u gorm.io/driver/mysql // get dialector of mysql from gorm

那么你可以使用gorm的Clauses

这段代码对你有用。

import (
   "gorm.io/gorm"
   "gorm.io/driver/mysql"
)


func main(){
    db, err := gorm.Open(mysql.Open(MYSQL_CONNECTION_STRING), &gorm.Config{})

    if err != nil {
        fmt.Println(err.Error())
    }else{
        db.Clauses(clause.Insert{Modifier: "IGNORE"}).Create(&user)
    }
}

【讨论】:

  • 非常感谢您的回答。你知道gorm v1中有没有办法insert ignore
  • @RP 欢迎您,正如您所说,您可以使用DB.Raw
【解决方案2】:

对于Gorm v2,答案很明确:Clause in Gorm

对于Gorm v1,您可以在Gorm v1 的测试中找到解决方案。 参考:https://github.com/jinzhu/gorm/blob/master/create_test.go#L285

    if DB.Dialect().GetName() == "mysql" && DB.Set("gorm:insert_modifier", "IGNORE").Create(&user).Error != nil {
        t.Error("Should ignore duplicate user insert by insert modifier:IGNORE ")
    }

我多次遇到这个问题,因为我们团队中的很多人仍然有大量使用 Gorm v1 的代码...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多