Go 如何在sqlite中插入数组?
我有如下结构:Go 如何在sqlite中插入数组?,go,sqlite,Go,Sqlite,我有如下结构: type Foo struct { bars []string } 由于sqlite3不支持数组数据类型,我们是否可以将[]字符串存储为字符串,并在检索return时将其存储为字符串的片段?试图实现如下所示,但由于类型不匹配而出现错误。这里需要做什么 编辑:我已经更改了代码,看起来正在工作 type strArray []string func (strarr StrArray) Value() (driver.Value, error) { if strarr
type Foo struct {
bars []string
}
由于sqlite3不支持数组数据类型,我们是否可以将[]字符串
存储为字符串,并在检索return时将其存储为字符串的片段?试图实现如下所示,但由于类型不匹配而出现错误。这里需要做什么
编辑:我已经更改了代码,看起来正在工作
type strArray []string
func (strarr StrArray) Value() (driver.Value, error) {
if strarr != nil {
resarr := strings.Join(strarr, "")
return resarr, nil
}
return nil, nil
}
作为对
数据库/sql/driver.Valuer
的补充,您还需要实现数据库/sql.Scanner
,以便从数据库中读取您的类型。
当您考虑如何实现它时,很明显,在Valuer
中,您应该使用一些分隔符字符/字符串(当然不出现在数据中)连接您的切片,以便在检索时将其拆分回来
假设这样的分隔符是代码>(我的猜测),用于阅读的代码如下所示:
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
}
在编写时,需要在Valuer
实现中使用strings.Join(strarr,“;”)
其他不那么简单的实现需要封送您的片,并以某种方式将结果字节编码为字符串(base32/64?json?)。在任何情况下,在将不同的切片元素保存到数据库时都不需要丢失这些信息。包括完整的错误消息。strings。Split
用于将字符串拆分为切片,而不是将切片转换为字符串。您可能希望加入而不是。