将客户端UUID转换为SQL UUID。

4
我正在使用go和包uuid生成一个[16]byte类型的UUID。然而,当我尝试将该UUID插入到我的postgres列中,类型为uuid,我收到错误信息converting argument $1 type: unsupported type [16]uint8, a array。所以显然我应该在将其插入数据库之前在客户端上转换UUID。我该如何做?我应该将它转换成什么类型?
简而言之:在postgres中,哪种go数据类型可以与uuid一起使用?

1
你可以尝试使用切片(slice)来代替数组(array)。只需在Go uuid后添加 [:] 即可。例如,db.Insert("blah...", myUUID[:]) - sberry
您可能还想尝试使用格式化的字符串 uuid。由于我使用过的每个 uuid 库都实现了 Stringer 接口,如果切片不起作用,我也会尝试使用 myUUID.String() - sberry
@sberry 转换为 slice 时出现了不同的错误:pq: invalid byte sequence for encoding "UTF8": 0x83 - Zachscs
1
假设这是正确的项目,这可能会有所帮助:https://github.com/go-pg/pg/issues/483 - sberry
糟糕。我之前使用了go.uuid,但是在我的模型中将uuid定义为[16]byte,因为文档中是这个类型,将其更改为uuid.UUID数据类型解决了问题,而无需进行任何转换。抱歉。 - Zachscs
1个回答

3

感谢@sberry提供的链接,我找到了解决方法。以下是代码片段,希望对你有帮助(使用PostgreSQL 9.5数据库):

import (
    "database/sql"
    "net/http"

    "github.com/google/uuid"
)

type Thing struct {
    ID     uuid.UUID `json:"-" sql:",type:uuid"`
    Name   string    `json:"name"`
}

// For a database table created as such:
// CREATE TABLE things ( 
// id UUID PRIMARY KEY DEFAULT gen_random_uuid(), 
// name TEXT DEFAULT ''::text
// )

func selectThingssSQL() ([]Thing, error) {
    things := make([]Thing, 0)

    rows, err := db.Query("SELECT id, name FROM things")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    for rows.Next() {
        t := &Thing{}
        if err := rows.Scan(&t.ID, &t.Name); err != nil {
            return nil, err
        }
        things = append(things, *t)
    }

    return things, nil
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接