将struct-filed中的接口映射为postgresdb列数据类型



我有一个结构,其中一个字段类型是interface,我如何将接口映射到db字段(应该是列类型)中,以便检索它?在下面的代码中,我想知道如何映射数据库中的Task字段,这样我就可以存储";a";以及";b";数据库中。如果它不是一个接口,我本可以映射到底层结构。我在postgres包中没有任何限制要使用

package main
import (
"fmt"
)
type Sai struct {
Name string. // can map this in db as string
Task Test.  // how should i map this
}
type Test interface {
Print()
}
type dummyStruct1 struct {
Name StringStruct
}
type StringStruct struct {
Name string
}
type dummyStruct2 struct {
Name StringStruct
}
func main() {
fmt.Println("Hello, playground")
s1 := dummyStruct1{Name: StringStruct{"jon"}}
s2 := dummyStruct1{Name: StringStruct{"smith"}}
a := Sai{Name: "task1", Task: s1.Hello()}
b := Sai{Name: "task1", Task: s2.Hello()}
a.Task.Print()
b.Task.Print()
}
func (s StringStruct) Print() {
fmt.Println(s.Name)
}
func (d dummyStruct1) Hello() StringStruct {
return d.Name
}
func (d dummyStruct2) Hello() StringStruct {
return d.Name
}

如果您是实现接口Test:的具体类型的人

如果你可以修改Test本身做:

import (
"database/sql"
"database/sql/driver"
)
// other stuff
type Test interface{
sql.Scanner
driver.Valuer
Print()
}

否则创建一个新型TestDB

import (
"database/sql"
"database/sql/driver"
)
// other stuff
type TestDB interface{
sql.Scanner
driver.Valuer
Test
}

现在,无论您创建哪种新类型,都必须实现sql。扫描仪和驱动程序。估价师接口。当向数据库写入值或从数据库扫描数据时,lib/pq会在内部自动使用这些值。

作为的一个例子

// Assuming Test can implement Valuer and Scanner interfaces
package main
import (
"fmt"
"database/sql"
"database/sql/driver"
)
type Sai struct {
Name string // can map this in db as string
Task Test  // how should i map this
}
type Test interface {
sql.Scanner
driver.Valuer
Print()
}
type StringStruct struct {
Name string
}
func main() {
...
}
func (s StringStruct) Print() {
fmt.Println(s.Name)
}
func (s StringStruct) Value() (driver.Value, error) {
return s.Name
}
func (s *StringStruct) Scan(src interface{}) error {
v, ok := src.(string)
if !ok {
return fmt.Errorf("not a string")
}
s.Name = v
}
// more code
...
...

现在,您可以在postgres中存储任何类型为StringStruct(也是Test)的内容作为简单的varchartext。这也不仅限于strings,尽管正如您所知,实际上这是我当前从pq存储和检索json的方法。

最新更新