Sql 将枚举值保存到数据库

Sql 将枚举值保存到数据库,sql,types,enums,go,Sql,Types,Enums,Go,我是新手,我正在尝试编写一个小程序,将枚举值保存到数据库中。 我声明我的值的方式如下: type FileType int64 const ( movie FileType = iota music book etc ) 我在结构中使用以下值: type File struct { Name string Type FileType Size int64 } dbmap.Insert(&File{"MyB

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

type FileType int64
const (
    movie FileType = iota
    music
    book
    etc
)
我在结构中使用以下值:

type File struct {
    Name     string
    Type     FileType
    Size     int64
}
dbmap.Insert(&File{"MyBook.pdf",movie,1000})
我使用gorp来处理我的数据库,但我想gorp的使用与我的问题无关。我在数据库中输入的内容如下:

type File struct {
    Name     string
    Type     FileType
    Size     int64
}
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反射和sql包的源代码,有一些方法可以进行这种转换,但它们似乎失败了。这是虫子吗?有什么问题
  • 我发现,可以通过实现以下方法实现
    sql.Scanner
    接口:

    Scan(src interface{}) error
    
    我尝试实现该方法,甚至能够从
    src
    中获得正确的值,并将其转换为
    文件类型
    ,但我不知道是否应该为“
    (f*FileType)
    (f FileType)
    实现该方法。无论哪种方式调用该方法,但我都无法覆盖
    f
    (或者至少更新稍后会丢失)并且从DB读取的
    文件
    实例的
    文件的值始终为“0”。键入

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

  • 围棋需要有特定的类型,这有时可能是一种痛苦
  • (f FileType)
    (f*FileType)
    对于“本机”类型便宜,除非您有一个复杂的类型,否则最好不要使用指针
  • 不覆盖是什么意思?修改结构后是否重新保存

  • 我最近也有同样的需求,解决方案是实现两个接口:

  • 下面是一个工作示例:

    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 }
    

    有点离题,但可能对其他人有用,因为在处理golang中的postgres enum字段(以字节返回)时,在解决类似问题时,我一直在重复这个问题/答案


    关于2:好的,但是当我写类似于“f=book”的东西时,如何在“(f FileType)”的情况下更改“f”"在扫描方法中,它没有效果。如果它在指针接收器上运行,您只能修改您的值。请查看中的
    sql.NullInt64
    的实现。这是正确的答案,应该被接受。干得好。出于好奇,我是一个完全的新手。有什么好的理由让它成为int64吗?看起来您只需要一个int16甚至int8,因为您可能不会有数十亿个可能的值。@bigblind这是原始问题所使用的。在它成为问题之前,或者在问题空间得到保证之前,我通常不会太担心值的大小。Go没有
    enum
    s。您的常量是
    string类型的
    。如果您希望它们的类型为
    状态
    (您需要),那么您应该使用
    Complete Status=“Complete”
    Complete Status=“Complete”
    ,等等(而且,所有资本标识符都不是惯用的Go)“DaveC,谢谢,更新!我要说的是,PASGRES'的实际<代码> EnUM < /Case>列类型,但是很好的修正。你不应该在GO的范围之外使用IOTA值,例如数据库。如果你要重新排序常量,或者在中间添加新的IOTA值,IOTA值将改变不匹配的现有记录。在你的数据库中。