drhs13583567608 2018-09-24 19:45
浏览 467
已采纳

如何正确使用FirstOrCreate

I have the following simple struct

type Profile struct {
    gorm.Model

    Email     string    `json:"email" sql:"not null;unique"`
    LastLogin time.Time `json:"lastlogin"`
}

I'm trying to make a insert if it doesn't exist via

  db.Con.Debug().Where(db.Profile{Email: "user@domain.com"}).Assign(db.Profile{LastLogin: time.Now()}).FirstOrCreate(&profile)

I get the following in my logs

(/Users/mzupan/go/src/gitlab.com/org/app/pkg/auth/login.go:182)
[2018-09-24 13:35:58]  [4.56ms]  SELECT * FROM "profiles"  WHERE "profiles"."deleted_at" IS NULL AND (("profiles"."email" = 'user@domain.com')) ORDER BY "profiles"."id" ASC LIMIT 1
[0 rows affected or returned ]

(/Users/mzupan/go/src/gitlab.com/org/app/pkg/auth/login.go:182)
[2018-09-24 13:35:58]  [1.77ms]  UPDATE "profiles" SET "last_login" = '2018-09-24 13:35:58', "updated_at" = '2018-09-24 13:35:58'  WHERE "profiles"."deleted_at" IS NULL AND (("profiles"."email" = 'user@domain.com'))
[0 rows affected or returned ]

So it's trying to do the select/update even though 0 rows are found in the select. Seems to me I'm doing the right thing.

  • 写回答

1条回答 默认 最新

  • duano3557 2018-09-25 02:49
    关注

    I think you forget to create the table db.CreateTable(&Profile{})

    Here is a working example:

    package main
    
    import (
        "time"
    
        "github.com/jinzhu/gorm"
        _ "github.com/jinzhu/gorm/dialects/sqlite"
    )
    
    type Profile struct {
        gorm.Model
    
        Email     string    `json:"email" sql:"not null;unique"`
        LastLogin time.Time `json:"lastlogin"`
    }
    
    func main() {
        db, err := gorm.Open("sqlite3", "test.db")
        if err != nil {
            panic("failed to connect database")
        }
        defer db.Close()
        // Create the table...
        // Read the doc at: http://doc.gorm.io/database.html#migration -> sec: Create Table
        db.CreateTable(&Profile{})
    
        var profile Profile
        db.Debug().Where(Profile{Email: "user@domain.com"}).Assign(Profile{LastLogin: time.Now()}).FirstOrCreate(&profile)
    }
    

    Out put:

    [2018-09-25 09:47:35]  [0.18ms]  INSERT INTO "profiles" ("created_at","updated_at","deleted_at","email","last_login") VALUES ('2018-09-25 09:47:35','2018-09-25 09:47:35',NULL,'user@domain.com','2018-09-25 09:47:35')
    [1 rows affected or returned ]
    

    Hope this help :)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 像这种代码要怎么跑起来?
  • ¥15 怎么改成循环输入删除(语言-c语言)
  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误
  • ¥100 当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧
  • ¥15 图示五个参数的模型校正是用什么方法做出来的。如何建立其他模型
  • ¥100 描述一下元器件的基本功能,pcba板的基本原理
  • ¥15 STM32无法向设备写入固件