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

7 回复

谢谢,这个方法奏效了。

更多关于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 插入数据库表中。
	}

参见 https://play.golang.org/p/iMI0ubaAm62

要将模板执行结果存储到数据库,需要先将模板执行到缓冲区(如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)
    }
}

这样数据库中将存储格式化后的模板字符串,而不是原始数据数组。

回到顶部