Golang如何从数据库中读取并填充数据
Golang如何从数据库中读取并填充数据 如何从数据库中获取数据并与其他变量混合使用。
go 文件
type User struct {
UserEmail string
}
type Menu struct{
MenuName string
}
type Page struct {
Title string
Email User
UserMenu []Menu
}
func Dashboard(res http.ResponseWriter, req *http.Request) {
userName:= getUserName(req)
if userName != "" {
UserEmail := userName
UserMenu :=Menu{}
records :=[]Menu{}
selDB, err :=config.DB.Query("SELECT menuname FROM tblmenu ")
if err != nil {
panic(err.Error())
}
for selDB.Next() {
var menuname string
err = selDB.Scan(&menuname)
if err != nil {
panic(err.Error())
}
UserMenu.MenuName = menuname
records = append(records, UserMenu)
}
data:=Page{
Title: "Dashboard",
Email:User{UserEmail:UserEmail},
UserMenu: []Menu{
{MenuName:UserMenu.MenuName},
},
}
fmt.Println(data)
templating.Display(res, "index",data)
} else {
http.Redirect(res, req, "/", 302)
return
}
}
html 文件
{{.Title}} <br>
{{.Email.UserEmail}}<br>
{{range .Menu}}
<li>{{.MenuName}}</li>
{{end}}
提前感谢。
更多关于Golang如何从数据库中读取并填充数据的实战教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢
在SQL查询中使用JOIN还是UNION?
为了获得更准确的答案,您需要补充说明数据是如何存储的结构信息,包括表和列的定义。
这可能不是 Golang 的问题。您的问题描述得有些不够清晰。
n_oandasan:
如何将数据库中的数据与其他变量混合填充。
你所说的"混合"是什么意思?你只需要借助驱动程序取出需要的数据,不是吗? 你需要了解数据的结构。
我将其理解为涉及三种语言或层次/层级:Go、SQL 和 HTML。问题出在哪个层面?是获取数据还是显示数据?
我不太确定你的问题是什么。运行这段代码时是否出现任何错误?是否得到了预期的输出?如果没有,你期望得到什么?
func main() {
fmt.Println("hello world")
}
您展示的结构体只显示了结果中想要展示的部分,而不是完整的数据库结构体。
因此,这只是一个初步猜测,可能只能为您提供从数据库获取数据的思路:
SELECT "MenuName","Title","Email" etc FROM Page
LEFT JOIN Menu ON "Menu_ID"="Page_Menu_ID"
WHERE "Menu_ID"=1
完整的数据结构体应同时显示唯一ID和外键以及相关字段。这样您才能获得更准确的答案。
如前所述,这可能是一个SQL问题,或者是一个HTML问题。以我对Golang的有限了解,我认为这不是一个Golang问题。如果我说错了,请纠正我。
如何在一次查询中同时获取主菜单和子菜单。
selDB, err :=config.DB.Query("SELECT menuname,icon,level FROM tblmenu order by mainmenu")
if err != nil {
panic(err.Error())
}
for selDB.Next() {
var level int
var menuname,icon string
err = selDB.Scan(&menuname,&icon,&level)
if err != nil {
panic(err.Error())
}
UserMenu.MenuName = menuname
UserMenu.Icon = icon
UserMenu.Level = level
records = append(records, UserMenu)
}
data:=Page{
Title: "Dashboard",
UserEmail: UserEmail,
UserMenu: records,
}
fmt.Println(data)
templating.Display(res, "index",data)
func Dashboard(res http.ResponseWriter, req *http.Request) {
userName:= getUserName(req)
if userName != "" {
UserEmail := userName
UserMenu :=Menu{}
records :=[]Menu{}
selDB, err :=config.DB.Query("SELECT menuname,icon,level FROM tblmenu order by mainmenu")
if err != nil {
panic(err.Error())
}
for selDB.Next() {
var level int
var menuname,icon string
err = selDB.Scan(&menuname,&icon,&level)
if err != nil {
panic(err.Error())
}
UserMenu.MenuName = menuname
UserMenu.Icon = icon
UserMenu.Level = level
records = append(records, UserMenu)
}
data:=Page{
Title: "Dashboard",
UserEmail: UserEmail,
UserMenu: records,
}
fmt.Println(data)
templating.Display(res, "index",data)
} else {
http.Redirect(res, req, "/", 302)
return
}
}
在子菜单中如何显示。谢谢
Submenu
<li class="treeview">
<a href="#"><i class="fa {{.Icon}}"></i> <span>{{.MenuName}}</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#">{{.MenuName}}</a></li>
</ul>
</li>
Main Menu
<li class="active"><a href="#"><i class="fa {{.Icon}}"></i> <span>{{.MenuName}}</span>
感谢sibert。这是我的结构体
type Menu struct{
MenuName string
Icon string
Level int
}
type Page struct {
Title string
UserEmail string
UserMenu []Menu
}
func Dashboard(res http.ResponseWriter, req *http.Request) {
userName:= getUserName(req)
if userName != "" {
UserEmail := userName
UserMenu :=Menu{}
records :=[]Menu{}
selDB, err :=config.DB.Query("SELECT menuname,icon,level FROM tblmenu order by mainmenu")
if err != nil {
panic(err.Error())
}
for selDB.Next() {
var level int
var menuname,icon string
err = selDB.Scan(&menuname,&icon,&level)
if err != nil {
panic(err.Error())
}
UserMenu.MenuName = menuname
UserMenu.Icon = icon
UserMenu.Level = level
records = append(records, UserMenu)
}
data:=Page{
Title: "Dashboard",
UserEmail: UserEmail,
UserMenu: records,
}
fmt.Println(data)
templating.Display(res, "index",data)
} else {
http.Redirect(res, req, "/", 302)
return
}
}
{{range .UserMenu}}
{{if eq .Level 10}}
<li class="treeview">
<a href="#"><i class="fa {{.Icon}}"></i> <span>{{.MenuName}}</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#">子菜单放在这里</a></li>
</ul>
</li>
{{else}}
<li class="active"><a href="#"><i class="fa {{.Icon}}"></i> <span>{{.MenuName}}</span></a></li>
{{end}}
{{end}}
在您的代码中,从数据库读取数据并填充结构体的逻辑存在几个问题,特别是在处理切片和模板渲染方面。以下是修正后的代码和解释:
主要问题:
- 在循环中重复使用同一个
UserMenu变量,导致切片中所有元素都指向最后一个值 - 模板中使用了错误的字段名
.Menu,应该是.UserMenu - 数据填充逻辑不正确
修正后的Go代码:
type User struct {
UserEmail string
}
type Menu struct {
MenuName string
}
type Page struct {
Title string
Email User
UserMenu []Menu
}
func Dashboard(res http.ResponseWriter, req *http.Request) {
userName := getUserName(req)
if userName != "" {
// 从数据库获取菜单数据
var records []Menu
selDB, err := config.DB.Query("SELECT menuname FROM tblmenu")
if err != nil {
panic(err.Error())
}
defer selDB.Close()
for selDB.Next() {
var menu Menu
err = selDB.Scan(&menu.MenuName)
if err != nil {
panic(err.Error())
}
records = append(records, menu)
}
// 构建页面数据
data := Page{
Title: "Dashboard",
Email: User{UserEmail: userName},
UserMenu: records,
}
fmt.Printf("Data: %+v\n", data)
templating.Display(res, "index", data)
} else {
http.Redirect(res, req, "/", 302)
}
}
修正后的HTML模板:
{{.Title}} <br>
{{.Email.UserEmail}}<br>
{{range .UserMenu}}
<li>{{.MenuName}}</li>
{{end}}
关键改进:
- 正确的切片处理:在循环中创建新的
Menu实例,避免所有元素引用同一个内存地址 - 添加defer语句:确保数据库连接正确关闭
- 简化数据填充:直接将查询结果赋给
UserMenu字段 - 修正模板字段名:使用正确的
.UserMenu而不是.Menu
示例输出结构:
如果数据库中有"首页", “用户管理”, "系统设置"三个菜单,data结构将包含:
Page{
Title: "Dashboard",
Email: User{UserEmail: "user@example.com"},
UserMenu: []Menu{
{MenuName: "首页"},
{MenuName: "用户管理"},
{MenuName: "系统设置"},
},
}
这样修改后,模板将能正确显示所有菜单项,每个菜单都会单独显示在列表中。

