我的结构如下:
type Foo struct {
bars []string
}
由于sqlite3不支持数组数据类型,我们可以将[]string
存储为字符串,同时将返回检索为字符串片段吗?试图像下面这样实现,但由于类型不匹配而得到错误。需要做什么?
编辑:我更改了代码,看起来像是在工作
type strArray []string
func (strarr StrArray) Value() (driver.Value, error) {
if strarr != nil {
resarr := strings.Join(strarr, "")
return resarr, nil
}
return nil, nil
}
答案 0 :(得分:1)
database/sql/driver.Valuer
的补充,您还需要实现database/sql.Scanner
以从数据库中读取您的类型。
当你想到如何实现它时,显而易见的是,Valuer
你应该Join
你的切片带有一些分隔字符/字符串(当然不会出现在数据中)才能够Split
在检索时它回来了。
假设这样的分隔符是;
(我的猜测),阅读代码如下:
func (a *strArray) Scan(value interface{}) error {
if value == nil {
return nil // case when value from the db was NULL
}
s, ok := value.(string)
if !ok {
return fmt.Errorf("failed to cast value to string: %v", value)
}
*a = strings.Split(s, ";")
return nil
}
对于写作,您需要在strings.Join(strarr, ";")
实施中使用Valuer
。
其他不太重要的实现需要编组切片并将结果字节以某种方式编码为字符串(base32 / 64?json?)。在任何情况下,您都需要在将信息保存到数据库时不要丢失不同切片元素的信息。