Golang将模板执行到数据库的实现方法
Golang将模板执行到数据库的实现方法 尝试执行一个模板,并将结果存储到数据库中。目前,数据确实被存储了,但并不是以我想要的模板形式存储。
type Data struct {
Msg string
Name string
}
type DataDB struct {
ID int
Data
}
func main() {
justin := DataDB{ID:1, Data: Data {Msg: "Justin", Name: "ABC"}}
ruben := DataDB{ID:2, Data: Data {Msg: "Ruben", Name: "tratata"}}
petyaT := DataDB{ID:1, Data: Data {Msg: "Petya Tereodor Pidgallo", Name: "ololol"}}
datas := []DataDB{justin, ruben, petyaT}
tpl, err := template.New("msgs").Parse(` {{range .}}
Hello {{.Data.Msg}}, my name is {{.Data.Name}}
{{end}}
`)
if err != nil {
panic(err)
}
err = tpl.Execute(os.Stdout, datas)
if err != nil {
log.Fatalln(err)
}
for _, v := range datas {
s := []string{v.Data.Msg,v.Data.Name}
_, err = db.Exec("INSERT INTO datadb (id, data) VALUES($1, $2)", v.ID, pq.Array(s))
if err != nil {
panic(err)
}
}
}
我将模板执行输出到标准输出,得到的结果是正确的: Hello Justin, my name is ABC Hello Ruben, my name is tratata Hello Petya Tereodor Pidgallo, my name is ololol.
但在我的数据库中,我得到的是: 1"{“Justin”,“ABC”}" 2"{“Ruben”,“tratata”}" 1"{“Petya Tereodor Pidgallo”,“ololol”}"
我正尝试将模板执行的结果存储到我的数据库中(即在执行模板后,将结果存储到数据库)。
希望我解释清楚了。提前感谢。
更多关于Golang将模板执行到数据库的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html
它的类型是字符可变类型。基本上就是一个字符串。
是的,我不太确定如何让“s”成为执行模板后的结果。
JustinObanor: 但是在我数据库中,我得到的是 -
1"{“Justin”,“ABC”}"
列的数据类型是什么?因为这看起来像是你试图写入数据库中的一个JSON类型的列,这可以解释输出的格式。
你执行了模板并将结果写入标准输出。然后,之后你将每个
DataDB的字符串表示形式写入数据库。如果你想将执行模板的结果存储到数据库,你应该让s成为使用DataDB执行模板的结果。
err = tpl.Execute(os.Stdout, datas)
在使用 Template.Execute 时,可以尝试类似这样的方法:
var tpl bytes.Buffer
if err := t.Execute(&tpl, data); err != nil {
return err
}
result := tpl.String()
编辑: 你的代码可以这样写:
tpl, err := template.New("msgs").Parse(`Hello {{.Data.Msg}}, my name is {{.Data.Name}}`)
if err != nil {
panic(err)
}
for _, v := range datas {
var buf bytes.Buffer
if err := tpl.Execute(&buf, v); err != nil {
log.Fatalln(err)
}
s := buf.String()
fmt.Println(s)
// 将 s 插入数据库表中。
}
要将模板执行结果存储到数据库,需要先将模板执行到缓冲区(如bytes.Buffer),然后将缓冲区内容作为字符串插入数据库。以下是修改后的代码示例:
package main
import (
"bytes"
"database/sql"
"log"
"os"
"text/template"
_ "github.com/lib/pq"
)
type Data struct {
Msg string
Name string
}
type DataDB struct {
ID int
Data Data
}
func main() {
// 假设已初始化数据库连接
// db, err := sql.Open("postgres", "connection_string")
justin := DataDB{ID: 1, Data: Data{Msg: "Justin", Name: "ABC"}}
ruben := DataDB{ID: 2, Data: Data{Msg: "Ruben", Name: "tratata"}}
petyaT := DataDB{ID: 3, Data: Data{Msg: "Petya Tereodor Pidgallo", Name: "ololol"}}
datas := []DataDB{justin, ruben, petyaT}
tpl, err := template.New("msgs").Parse(`{{range .}}
Hello {{.Data.Msg}}, my name is {{.Data.Name}}
{{end}}`)
if err != nil {
panic(err)
}
// 执行模板到标准输出
err = tpl.Execute(os.Stdout, datas)
if err != nil {
log.Fatalln(err)
}
// 执行模板到缓冲区
var buf bytes.Buffer
err = tpl.Execute(&buf, datas)
if err != nil {
log.Fatalln(err)
}
// 将缓冲区内容作为字符串插入数据库
_, err = db.Exec("INSERT INTO datadb (id, data) VALUES($1, $2)", 1, buf.String())
if err != nil {
panic(err)
}
}
如果要将每个数据项单独存储,可以这样修改:
// 为单个数据项创建模板
singleTpl, err := template.New("single").Parse(`Hello {{.Data.Msg}}, my name is {{.Data.Name}}`)
if err != nil {
panic(err)
}
for _, v := range datas {
var buf bytes.Buffer
err = singleTpl.Execute(&buf, v)
if err != nil {
log.Fatalln(err)
}
_, err = db.Exec("INSERT INTO datadb (id, data) VALUES($1, $2)", v.ID, buf.String())
if err != nil {
panic(err)
}
}
这样数据库中将存储格式化后的模板字符串,而不是原始数据数组。

