gpt4 book ai didi

sql - 将枚举值保存到数据库

转载 作者:IT老高 更新时间:2023-10-28 13:05:01 24 4
gpt4 key购买 nike

我是 Go 新手,我正在尝试编写一个小程序来将枚举值保存到数据库中。我声明我的值(value)观的方式如下:

type FileType int64
const (
movie FileType = iota
music
book
etc
)

我在结构中使用这些值,如下所示:

type File struct {
Name string
Type FileType
Size int64
}

我将 gorp 用于我的数据库内容,但我想 gorp 的使用与我的问题无关。我把东西放在我的数据库中是这样的:

dbmap.Insert(&File{"MyBook.pdf",movie,1000})

但是当我尝试检索东西时……

dbmap.Select(&dbFiles, "select * from Files")

我收到以下错误:

panic: reflect.Set: value of type int64 is not assignable to type main.FileType

当我使用 int64 作为 const(...)File.Type 字段的类型时,一切正常,但我是 Go 新手,想了解这个问题。在我看来,我有两个问题:

  1. 为什么 Go 不能成功转换这些东西?我查看了 Go 反射和 sql 包的源代码,并且有这种转换的方法,但它们似乎失败了。这是一个错误吗?有什么问题?
  2. 我想通了,sql.Scanner接口(interface)可以通过实现如下方法实现:

    Scan(src interface{}) error

    我尝试实现该方法,我什至能够从 src 中获取正确的值并将其转换为 FileType,但我很困惑是否应该实现“(f *FileType)(f FileType) 的方法。无论哪种方式都会调用该方法,但是我无法覆盖 f (或者至少更新稍后会丢失)并且从数据库读取的 File 实例始终具有“0”作为 File.Type 的值。

你对这两点有什么想法吗?

最佳答案

我最近也有同样的需求,解决办法是实现两个接口(interface):

  1. sql/driver.Valuer
  2. sql.Scanner

这是一个工作示例:

type FileType int64

func (u *FileType) Scan(value interface{}) error { *u = FileType(value.(int64)); return nil }
func (u FileType) Value() (driver.Value, error) { return int64(u), nil }

关于sql - 将枚举值保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24264485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com