duangong1979 2018-04-05 14:58
浏览 204
已采纳

多个row.Next()同时进入golang sql / database

I am working on a function which getting users my problem is i have to return the result of the two queries as one result in the rows.next() and rows1.next() like user_id,subject,phone and also body as same result .

here is what i made but it doesn't work cloud you please help me out with some suggestions , thanks indeed func GetUsers() (users []Users, err error) {

users = make([]Users, 0)
rows, err := db1.Query("SELECT  user_id, subject,phone FROM users limit 11")
rows1, err := db1.Query("Select body from users limit 11")
defer rows.Close()
if err != nil {
    // handle this error better than this
    log.Fatal(err)
    //return
}
var user Users
for rows.Next() {
    rows.Scan(&user.ID, &user.Subject, &user.Phone)
    users = append(users, user)
}
for rows1.Next() {

    rows1.Scan(&user.Body)
    users = append(users, user)

}
return 
}

i have a table called users which has no primary key , basically user_id . name. body 1 . model . 2 1 . brand. 1 1 . fuel. 3 1 . date .1 1 . year . 1

i have to have a result userid , model, brand , fuel ,date,year 1 . 2 1 . 3 . 1 . 1

so the values in the column name gonna be as a rows i have already defined my struct which containning all the fields needed

  • 写回答

1条回答 默认 最新

  • duan0424 2018-04-05 15:21
    关注

    Looking at the example code it's clear that you should do whatever you're doing in one query instead of two. Even if your real code is a little different, say you need to query more than one table, you should still probably do only one query using JOINs.

    users := make([]*User, 0)
    rows, err := db1.Query("SELECT  user_id, subject,phone, body FROM users limit 11")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    for rows.Next() {
        user := new(User)
        if err := rows.Scan(&user.ID, &user.Subject, &user.Phone, &user.Body); err != nil {
            panic(err)
        }       
        users = append(users, user)
    }
    if err := rows.Err(); err != nil {
        panic(err)
    }
    

    That said, if you want to do it the way you illustrated in your question you can do that like this.

    (this probably not what you should do)

    users := make([]*User, 0)
    rows, err := db1.Query("SELECT  user_id, subject,phone FROM users limit 11")
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    
    rows1, err := db1.Query("Select body from users limit 11")
    if err != nil {
        panic(err)
    }
    defer rows1.Close()
    
    for rows.Next() {
        user := new(User)
        if err := rows.Scan(&user.ID, &user.Subject, &user.Phone); err != nil {
            panic(err)
        }
        if !rows1.Next() {
            panic("no next body row")
        }
        if err := rows1.Scan(&user.Body); err != nil {
            panic(err)
        }
    
        users = append(users, user)
    }
    if err := rows.Err(); err != nil {
        panic(err)
    }
    if err := rows1.Err(); err != nil {
        panic(err)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵