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

12 回复

我指的是填充类别和子类别。

更多关于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}}

在您的代码中,从数据库读取数据并填充结构体的逻辑存在几个问题,特别是在处理切片和模板渲染方面。以下是修正后的代码和解释:

主要问题:

  1. 在循环中重复使用同一个UserMenu变量,导致切片中所有元素都指向最后一个值
  2. 模板中使用了错误的字段名.Menu,应该是.UserMenu
  3. 数据填充逻辑不正确

修正后的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}}

关键改进:

  1. 正确的切片处理:在循环中创建新的Menu实例,避免所有元素引用同一个内存地址
  2. 添加defer语句:确保数据库连接正确关闭
  3. 简化数据填充:直接将查询结果赋给UserMenu字段
  4. 修正模板字段名:使用正确的.UserMenu而不是.Menu

示例输出结构: 如果数据库中有"首页", “用户管理”, "系统设置"三个菜单,data结构将包含:

Page{
    Title: "Dashboard",
    Email: User{UserEmail: "user@example.com"},
    UserMenu: []Menu{
        {MenuName: "首页"},
        {MenuName: "用户管理"}, 
        {MenuName: "系统设置"},
    },
}

这样修改后,模板将能正确显示所有菜单项,每个菜单都会单独显示在列表中。

回到顶部