2015-02-13 1 views
1

Я пытаюсь внедрить результаты запроса Sql в таблицу html, используя GO в качестве задней части. Для итерации строки в Go используется функция Rows.Next(). Это работает для печати в окне консоли, но не для таблицы html. Вот мой Go Код:Как вставлять результаты SQLX в HTML с помощью GO (golang)

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) 
} 

Вот мой template.html

<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> 

подключиться к базе данных правильно и с помощью «FMT» пакет я могу напечатать правильно. Но я не могу понять, как пройти цикл для количества строк, сохраненных на странице html. Есть ли способ бросить sql.Rows на правильный тип или цикл для набора целого числа раз в html.

пс. Я попытался с помощью {{$ индекс: = 3}} ... {конец}} в HTML, но это не сработало

Любой входной сигнал был бы весьма признателен

+0

'rows' - ​​это ни один из массивов, каналов, трубопровода или карты. Таким образом, вы должны построить структуру в процессе получения данных строки, которые вы уже делаете. Затем используйте эту структуру. –

+0

Я добавил тип карты, чтобы удерживать количество строк, но теперь я не могу вставлять петли в html. Теперь моя проблема в том, что я не могу ссылаться на тип карты внутри цикла с диапазоном на другом типе карты в html. –

ответ

0

В начале нового row, вставьте строку «NewRow», чтобы служить в качестве флага в html. Затем в цикле {{range $ rowidx, $ rowdat: = .RowData}} добавьте оператор if, который заканчивается и запускает новую строку, если $ rowdat == "NewRow"

+0

Это работает !! Thanks –

+0

Без проблем человек. Просто здесь, чтобы помочь. –

Смежные вопросы