【问题标题】:Why is the value of my database column always 0?为什么我的数据库列的值总是 0?
【发布时间】:2015-03-29 21:14:38
【问题描述】:

我正在使用 go-gorm 从 PostgreSQL 数据库中获取值。相关代码如下:

type Chip struct {
    UUID    string `db:uuid`
    URL     string `db:url`
    N       int    `db:n`
    Pack_ID int    `db:pack_id`
}

func getChip(uuid string) (Chip, error) {
    var c Chip
    err := DB.Model(Chip{}).Where("uuid = ?", uuid).First(&c)
    return c, err.Error
}

当我将 UUID 字符串传递给 getChip 时,会返回正确的行并且所有值都是正确的除了,对于 c.Pack_ID,它始终是 0。顺便说一句,Pack_ID 永远不会是 0 的行。

这是来自 pgAdminIII 的屏幕截图,我希望能对这个问题有所了解:

关于可能出现什么问题的任何想法?我完全不知所措,在这里......

【问题讨论】:

  • 添加一些示例代码来展示如何将值添加到数据库中可能会很有用。您确定在插入 Pack_ID 时没有拼错变量名并且使用的是空变量吗?
  • @Jasper,数据库是用 PgAdminIII 手动填充的。我检查了几次,我看不出有拼写错误。但是,我是 postgres 的新手,有没有办法转储有关表的相关摘要信息?
  • @Jasper,但是,列名和结构名存在一个(可能)相关的差异。在 postgres 中,该列称为 pack_id,但在 go 代码中,它称为 Pack_ID。也就是说,db:pack_id 声明不应该让我摆脱麻烦吗? (编辑:请看上面的截图)
  • 鉴于 Postgres 使用 $1, $2, $3, etc 而不是 ? 进行参数化,您的意思是不是 .Where("uuid = $1", uuid).First(&c)
  • @elithrar,大概 :) 到底有什么区别?无论如何,我已经进行了更改,但我原来的问题仍然存在。

标签: postgresql go go-gorm


【解决方案1】:

您使用的结构标签似乎格式不正确。一个结构体标签should be of the form:

name:"value"

但你得到的是缺少值周围的引号:

name:value

尝试纠正这个问题。否则,Go 中的 struct 标签解析器将无法工作,因为它依赖于那些引号 as seen in the struct tag parser implementation

关于特定的结构标签:你确定你应该使用db吗?根据Gorm documentation,您可能想使用gorm:"column:..."。我期待您的类型定义是:

type Chip struct {
    UUID    string `gorm:"column:uuid;primary_key"`
    URL     string `gorm:"column:url"`
    N       int    `gorm:"column:n"`
    Pack_ID int    `gorm:"column:pack_id"`
}

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2017-10-18
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多