Search code examples
gogo-gorm

How to use Go / GORM to print SELECT query output without pre-defined struct


I am developing an API using Go which connects to MySQL database for some query execution. Am using GORM for database operations. But am stuck at printing the SELECT query output for the tables which I don't have the column names.

My use case is that, I need to run the query on multiple tables where I don't have an idea about what their column names and types are. And so I cannot pre-define a struct for all the current and future tables which might get added.

Is there a way to print/save the SELECT query output without a pre-defined struct ?

I tried do some using empty struct but it didn't help me.

P.S: Am a beginner in Go

    type Testing struct{}

    var test Testing
    dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", myds.DBuser, myds.DBpassword, myds.DBhost, myds.DBport, myds.DBname)
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        fmt.Println(err)
    }
    tx := db.Raw(query).Scan(&test)
    if tx.Error != nil {
        fmt.Println(tx.Error)
    }
    fmt.Println(test)

Solution

  • It worked for me by using a map type with interface. This helped me to save the SELECT query results without pre-defined struct or the column names.

        dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v", myds.DBuser, myds.DBpassword, myds.DBhost, myds.DBport, myds.DBname)
    
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            fmt.Println(err)
        }
    
        var result []map[string]interface{}
    
        tx := db.Raw(query).Scan(&result)
        if tx.Error != nil {
            fmt.Println(tx.Error)
            return
        }
        bytes, _ := json.Marshal(result)
        fmt.Println(string(bytes))