【问题标题】:How to get "select 1" data如何获取“选择1”数据
【发布时间】:2021-03-27 19:05:54
【问题描述】:

我正在尝试确定数据库中是否存在某个值,因此我选择使用Select 1 From table,但我怎样才能获取数据? 我想检查两个人是好友,这是我的模型

type Buddy struct {
    ID      uint64 `gorm:"primarykey"`
    UserID  uint32
    BuddyID uint32
}

这是我试过的gorm sql

// select 1 from buddies where user_id=? and buddy_id=?
type Result struct {
    Exist uint32
}
exist := &Result{}
orm.DB.Debug().Table("buddies").Raw("SELECT 1 as exist FROM buddies WHERE user_id = ? and buddy_id = ?", userID, buddyID).Scan(exist)

但我没有得到任何存在的东西。存在

【问题讨论】:

  • 不需要在原始查询中传递表;还要捕获错误以及在控制台中打印了什么查询?
  • 控制台打印“[1.994ms] [rows:-] SELECT 1 as exists FROM buddies WHERE user_id = 1000039 and buddy_id = 1000079”
  • 也许你有太多指向 exist 变量的指针。使用exist := Result{}.Scan(&exist)exist := &Result{}.Scan(exist)
  • @ducklu 问题是您传递 &exists 来扫描,因为指向指针的指针存在已经是一个指针,您可以直接调用 .Scan(exist) 并始终检查错误
  • 对不起,我复制了错误的代码,我修复它并再次尝试,存在仍然一无所获

标签: go go-gorm


【解决方案1】:

这里有一个功能可以按照您的要求以最佳方式完成

package main
    
    import (
        "gorm.io/driver/sqlite"
        "gorm.io/gorm"
        "log"
    )
    
    type Buddy struct {
        ID      uint64 `gorm:"primarykey"`
        UserID  uint32
        BuddyID uint32
    }
    func main() {
        db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
        if err != nil {
            panic("failed to connect database")
        }
    
        // Migrate the schema
        db.AutoMigrate(&Buddy{})
    
        // Create
        db.Create(&Buddy{UserID: 1, BuddyID: 2})
        db.Create(&Buddy{UserID: 2, BuddyID: 1})
        db.Create(&Buddy{UserID: 3, BuddyID: 1})
    
        var exists bool
        db.Raw("select case count(1) when 0 then false else true end FROM buddies WHERE user_id = ? and buddy_id = ?", 1, 2).Scan(&exists)
        log.Print(exists)
        db.Raw("select case count(1) when 0 then false else true end FROM buddies WHERE user_id = ? and buddy_id = ?", 3, 2).Scan(&exists)
        log.Print(exists)
    }

你可以检查它是否有效

【讨论】:

  • 我知道我可以用这个来检查两个人是不是朋友,但是这个用于SELECT *,我听说确定一个值的存在也许选择1会比选择*更有效
  • 你可以使用我提到的sql语句
  • 我的意思是选择1,也许这个问题可以说明我的意思:stackoverflow.com/questions/7171041/…,而且你写的第二个代码也不能改变存在(有点像我写的代码),因为 count(1) 创建了一个模型结构不存在的新列
  • 如果你想验证两个人是朋友,你可以选择两个选项之一,否则你问错了问题。
  • 我知道怎么写sql来判断两个人是朋友,但是当你通过gorm创建一个model struct不存在的新列时,出现了问题。就像你写的第二个代码一样,exists 不会得到正确的答案
【解决方案2】:
    queryResult := db.Where(fmt.Sprintf("user_id = %d and buddy_id = %d", 1, 2).Find(&Buddy)
    if queryResult.Error == nil {
       //you can also check queryResult.RowsAffected > 0
        result = queryResult.Statement.Model //get the returned data
    } else {
        //do something with queryResult.Error
    }

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 2021-05-03
    • 2019-03-23
    • 1970-01-01
    • 2021-08-14
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多