【问题标题】:How to query and handle a UUID created with go.uuid and inserted into PostgreSQL 11?如何查询和处理使用 go.uuid 创建并插入 PostgreSQL 11 的 UUID?
【发布时间】:2019-03-22 14:11:49
【问题描述】:

我在 PostgreSQL 表中插入了一个使用 go.uuid 创建的 UUID:

import (
        "github.com/satori/go.uuid"
) 

func main() {
        usid := uuid.Must(uuid.NewV4())
        fmt.Println("usid := uuid.Must(uuid.NewV4")
        fmt.Println(usid.String())
        res, err := stmt.Exec(cn, csn, ccn, id)
        if err != nil || res == nil {
                log.Fatal(err)
        }
}

    sStmt := "insert into basicuserinfo (cn, csn, ccn, appUserAccountID ) 
    values ($1, $2, $3, $4)"
    stmt, err := db.Prepare(sStmt)
    if err != nil {
            log.Fatal(err)
    }
    defer stmt.Close()
    fmt.Println("# Inserting values")

实际上在 postgreSQL 数据库中插入了一行:

           cn  |  csn  |  ccn | id
                              | 2412fcd3-8712-4a0f-830a-d77bd4cf2195      

为了使用 golang 变量进行查询,我首先尝试使用准备好的语句。 首先,使用 db.PrepareContext :

    sel := "SELECT appUserAccountID FROM basicuserinfo WHERE cn = $1 AND csn 
    = $2 AND ccn = $3"

     stmt, err = db.PrepareContext(ctx,sel)
    if err != nil {
            log.Fatal(err)
    }
    var utenteID string
    err = stmt.QueryRowContext(ctx,cn, csn, ccn).Scan(&utenteID)
    log.Printf("ID= %s\n", utenteID)
    fmt.Println("aaaaaaaaa") // Just to check that the this line gets executed

谁的执行保持“空闲”,处于待机状态,没有结束并产生任何输出:

marco@pc01:~/go/marcoGolang/goPostgres$ go run pqExample00.go
# Inserting values

然后我就这样试了,用db.Prepare():

    stmt, err = db.Prepare(sel)
    if err != nil {
            log.Fatal(err)
    }
    res, err = stmt.Exec(cnv, csnv, ccnv)

在第二种情况下,执行似乎成功结束,但我不知道如何将 sql.Result 转换为可以处理的正确形式,例如简单地使用 fmt.Println() 显示或获取其他处理。 那么...如何正确查询和处理使用 go.uuid 创建并插入 PostgreSQL 11 的 UUID?

期待您的帮助。 马可

【问题讨论】:

  • @mkopriva 我添加了一个显示空闲状态的屏幕截图,并更正了我之前写的内容
  • 什么是打印在屏幕截图中可见的“插入值”?你在执行正确的程序吗?您的示例代码中没有这样的打印语句,除此之外,该代码正在选择值而不是“插入”它们。
  • 没有名为appUserAccountID 的列。 QueryRowContext 返回的错误是什么? Exec 方法族适用于不返回结果集的语句,例如 UPDATE 和 DELETE。如果要检索结果,请使用 QueryRow* 方法之一。

标签: go uuid postgresql-11


【解决方案1】:

除非您有使用 PrepareContext 的理由,否则您可以这样做吗?

db, err := sql.Open("postgres", connectionString)

sel := "SELECT appUserAccountID FROM basicuserinfo WHERE cn = $1 AND csn = $2 AND ccn = $3"

var idn string
err = db.QueryRow(sel, cn, csn, ccn).Scan(&idn)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("idn: %v\n", idn)

【讨论】:

  • @mkopriva 感谢您发现 Conn 和错误,复制粘贴错误,已修复
  • 感谢 lor @snassr 和@mkopriva 的耐心帮助。马可
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2017-04-17
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多