如何使用GO(golang)在HTML中嵌入SQLX结果

如何使用GO(golang)在HTML中嵌入SQLX结果,html,sql,sql-server,templates,go,Html,Sql,Sql Server,Templates,Go,我正在尝试使用GO作为后端将Sql查询的结果嵌入到html表中。要在Go中迭代行结果,请使用Rows.Next()函数。这适用于打印到控制台窗口,但不适用于html表。 这是我的密码: package main // Database connection Code for http://play.golang.org/p/njPBsg0JjD import ( "net/http" "html/template" "fmt" "github.com/LukeM

我正在尝试使用GO作为后端将Sql查询的结果嵌入到html表中。要在Go中迭代行结果,请使用Rows.Next()函数。这适用于打印到控制台窗口,但不适用于html表。 这是我的密码:

package main
// Database connection Code for http://play.golang.org/p/njPBsg0JjD

import (
    "net/http"
    "html/template"
    "fmt"
    "github.com/LukeMauldin/lodbc"
    "github.com/jmoiron/sqlx"
    "database/sql"
)

//declare database class
var db *sqlx.DB

type webdata struct {
    Title string
    Heading string
    GridTitle string
    ColumnHeading [9]string
    RowData [9]string
    NumOfRows *sql.Rows
}

//this is the function handler to handle '/mbconsole'
func ConsoleHandler(w http.ResponseWriter, r *http.Request) {

    //declare an instance of webdata
    var wdata webdata

    //connect to database
    //Set ODBC driver level
    lodbc.SetODBCVersion(lodbc.ODBCVersion_3)

    var err error
    //connect to a Microsoft SQL Server
    db, err = sqlx.Open("lodbc", "[connectionstring]")
    if err == nil {
        fmt.Println("Connection successful")
    }else{
        fmt.Println("SQL Connection error", err)
    }

    // Execute the queries
    rows, err := db.Query("[Select ...]")
    if err != nil {
        panic(err.Error())
    }


    // Get column names
    columns, err := rows.Columns()
    if err != nil {
        panic(err.Error())
    }


    // Make a slice for the values
    values := make([]interface{}, len(columns))

    // rows.Scan wants '[]interface{}' as an argument, so we must copy the
    // references into such a slice
    // See http://code.google.com/p/go-wiki/wiki/InterfaceSlice for details
    scanArgs := make([]interface{}, len(values))

    for i := range values {
        scanArgs[i] = &values[i]
    }
    //fill table headings, the table returns 9 columns so I just hard coded it
    for i:=0;i<9;i++ {
        wdata.ColumnHeading[i] = columns[i]
    }

    wdata.NumOfRows = rows

    // Fetch rows
    for rows.Next() {
        err = rows.Scan(scanArgs...)
        if err != nil {
            panic(err.Error())
        }
        // Print data
        for i, value := range values {
            switch value.(type) {
            case nil:
                wdata.RowData[i] = "NULL"
            case []byte:
                wdata.RowData[i] = string(value.([]byte))
            default:
                wdata.RowData[i] = fmt.Sprint(value)
            }
        }
    }

    wdata.Title = "Page Title"
    wdata.Heading = "My View"
    wdata.GridTitle = "My Grid Title"

    //get the template the data will be loaded into
    t1, err := template.ParseFiles("template.html")
    if t1 == nil {
        fmt.Println("File Not Found: ", err)
    }
    //load the template with data and display
    terr := t1.Execute(w, &wdata)
    if terr != nil {
        fmt.Println("terr: ", terr)
    }

    db = db.Unsafe()
    defer db.Close()

}


func main() {
    http.HandleFunc("/",ConsoleHandler)
}
主程序包
//的数据库连接代码http://play.golang.org/p/njPBsg0JjD
进口(
“net/http”
“html/模板”
“fmt”
“github.com/LukeMauldin/lodbc”
“github.com/jmoiron/sqlx”
“数据库/sql”
)
//声明数据库类
var db*sqlx.db
类型webdata结构{
标题字符串
标题串
GridTitle字符串
列标题[9]字符串
行数据[9]字符串
numorrows*sql.Rows
}
//这是处理“/mbconsole”的函数处理程序
func控制台句柄(w http.ResponseWriter,r*http.Request){
//声明webdata的实例
var wdata网络数据
//连接到数据库
//设置ODBC驱动程序级别
lodbc.SetODBCVersion(lodbc.ODBCVersion_3)
变量错误
//连接到Microsoft SQL Server
db,err=sqlx.Open(“lodbc”,“connectionstring]”)
如果err==nil{
fmt.Println(“连接成功”)
}否则{
fmt.Println(“SQL连接错误”,错误)
}
//执行查询
行,err:=db.Query(“[Select…]”)
如果错误!=零{
死机(err.Error())
}
//获取列名
列,错误:=行。列()
如果错误!=零{
死机(err.Error())
}
//为值创建一个切片
值:=make([]接口{},len(列))
//Scan需要“[]接口{}”作为参数,因此必须复制
//对这样一个切片的引用
//看http://code.google.com/p/go-wiki/wiki/InterfaceSlice 详情
scanArgs:=make([]接口{},len(值))
对于i:=范围值{
scanArgs[i]=&值[i]
}
//填充表格标题,表格返回9列,所以我只是硬编码
对于i:=0;i
{{range$index,$rowval:=.numorrows}

在新行的开头,插入一个“NewRow”字符串作为html中的标志。然后在{range$rowidx,$rowdat:=.RowData}}循环中添加一个if语句,如果$rowdat==“NewRow”

我使用以下变量,则该语句将结束并开始新行:

html


名称1/第次>名称2
{{range.}}
{{.Name1}
{{.Name2}
{{end}

不是数组、通道、管道或映射。因此,您应该在获取行数据的过程中构建一个结构。然后使用该结构。我添加了一个映射类型来保存行数,但现在我无法在html中嵌入循环。现在我的问题是,我无法在带有ra的循环中引用映射类型在html中的另一个映射类型上创建nge。
<html>
<head><title>{{.Title}}</title></head><body>
...
<h1>{{.Heading}}</h1>
    <div id="gridviewcontainer">
    <br />
    <div id="gridtitle">
        <a href="{{.GridTitleLink}}" style="font-size:25px;">{{.GridTitle}}</a>
    </div>
    <table id="gridtable">
    <tr>{{range $ColumnIdx, $colheading := .ColumnHeading}}
    <th>{{$colheading}}</th>{{end}}</tr>
<<!---This is what is causing the issue, .NumOfRows is not a valid field, must be array, channel, pipeline, or map --> 
    {{range $index, $rowval := .NumOfRows}}
        <tr>
        {{range $rowidx, $rowdat := .RowData}}<td>{{$rowdat}}</td>{{end}}
        </tr>
        {{endfor}}
    </table>

...
</body>
</html>
func MainPageHandler(w http.ResponseWriter, r *http.Request) { 
    type User struct {
        Name1  string
        Name2  string
    }

    rows, err := database.Query("select  .......;")
    if err != nil {
        log.Println(err)
    }
    defer rows.Close()
    user_current := []User{}
    for rows.Next() {
        p := User{}
        err := rows.Scan(&p.Name1, &p.Name2 )
        if err != nil {
            fmt.Println(err)
            continue
        }
        user_current = append(user_current, p)
    }
    tmpl, _ := template.ParseFiles("main_page.html")
    tmpl.Execute(w, user_current)
}
<table>
     <thead><th>name1/th><th>name2</th></thead>
            {{range . }}
            <tr>
                <td>{{.Name1}}</td>
                <td>{{.Name2}}</td>
            </tr>
            {{end}}
        </table>