nakagami / firebirdsql

Firebird RDBMS sql driver for Go (golang)
MIT License
224 stars 60 forks source link

No output on complex Firebird queries in golang #127

Open michaelpietzsch opened 3 years ago

michaelpietzsch commented 3 years ago

I am currently working on a project to getting me started with golang / Firebird SQL and programming in general.

My Firebird SQL query works perfectly when run against the database:

NAME DELIVERY_DATE LIST
1 2021-06-19 19:00:00 MEGAITEM groß STK:1 | SMALLITEM STK:1 | DELTAITEM klein STK:1
NAME1 2021-06-19 12:00:00 ITEM STK:1
NAME2 2021-06-26 12:00:00 ITEM STK:1
NAME3 2021-06-18 17:00:00 DELTATIEM STK:1

However, when I run it in my code, I get an empty array as an answer. The small Firebird query in the comments works fine. It returns three columns and the struct is filled up as expected.

Command line output:

2021/07/03 14:18:30 &{0xc000162000 0x55a4c0 0xc000106540 <nil> <nil> {{0 0} 0 0 0 0} false <nil> []}
2021/07/03 14:18:30 []

Golang Code

package main

import (
    "database/sql"
    "html/template"
    "log"
    "net/http"

    _ "github.com/nakagami/firebirdsql"
)

type SqlTableContent struct {
    UID  string
    DATE string
    NAME string
}

func main() {

    log.Println("Server started on: http://localhost:8080")
    http.HandleFunc("/", Mainquery)
    http.ListenAndServe(":8080", nil)

}

func dbConn() (db *sql.DB) {
    db, err := sql.Open("firebirdsql", `SYSDBA:masterkey@localhost/C:\DATA.FDB`)
    if err != nil {
        panic(err.Error())
    }
    return db
}

var tmpl = template.Must(template.ParseGlob("form/*"))

func Mainquery(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/html")

    db := dbConn()
    query := `with data as ( select article_name || ' STK:' || cast(quantity as integer) as quantity  , PREORDER_ID as PID from preorder_item )  SELECT PREORDER.NAME ,PREORDER.DELIVERY_DATE  ,LIST(DATA.QUANTITY, ' | ') FROM PREORDER INNER JOIN DATA ON PREORDER.ID = DATA.PID GROUP by PREORDER.NAME  ,PREORDER.DELIVERY_DATE`

    //  selDB, err := db.Query("SELECT SALE_ID, DELIVERY_DATE, NAME FROM PREORDER") This works
    selDB, err := db.Query(query)
    if err != nil {
        panic(err.Error())
    }

    log.Println(selDB)
    var queryContent SqlTableContent
    var SqlTableContentArray []SqlTableContent
    for selDB.Next() {

        var id string
        var date string
        var name string

        err = selDB.Scan(&id, &date, &name)
        if err != nil {
            panic(err.Error())
        }
        queryContent.UID = id
        queryContent.DATE = date
        queryContent.NAME = name

        SqlTableContentArray = append(SqlTableContentArray, queryContent)

    }
    tmpl.ExecuteTemplate(w, "Show", SqlTableContentArray)
    log.Println(SqlTableContentArray)
    defer db.Close()
}
michaelpietzsch commented 3 years ago

I found the Issue. I had smiley charachter like this (🙂) in the db and it stopped everything. Can anyone check this out ?

michaelpietzsch commented 3 years ago

I also noted it dosent seem to support charachters like Ü Ä Ö and so forth... can anyone help out here

nakagami commented 3 years ago

I think you need to set Firebird charset to utf-8

michaelpietzsch commented 3 years ago

I think you need to set Firebird charset to utf-8

Ive explicitly checked for that and i can confirm that the DB was already running on UTF8

bat22 commented 3 years ago

@michaelpietzsch I think your query fails, you need to check error after loop

if selDB.Err() != nil {
   ...
}

Sess https://pkg.go.dev/database/sql#Rows.Next.