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
字段的类型时,一切正常,但我是新手,希望了解问题。
在我看来,我有两个问题:
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值将改变不匹配的现有记录。在你的数据库中。