2015-03-17 4 views
1

Я пытаюсь использовать go sql драйвер для чтения из таблиц базы данных, и я преобразовываю значения в []map[string]interface{}. Имя столбца - это ключ карты, а значения - interface{}. Я добавляю все столбцы в массив. В качестве примера я использую образец кода для «RawBytes» по адресу https://github.com/go-sql-driver/mysql/wiki/Examples.Перейти SQL драйвер получить интерфейс {} значения столбца

Однако в примере -вс значение столбца преобразуется в string следующим образом,

// Fetch rows 
for rows.Next() { 
    // get RawBytes from data 
    err = rows.Scan(scanArgs...) 
    if err != nil { 
     panic(err.Error()) // proper error handling instead of panic in your app 
    } 

    // Now do something with the data. 
    // Here we just print each column as a string. 
    var value string 
    for i, col := range values { 
     // Here we can check if the value is nil (NULL value) 
     if col == nil { 
      value = "NULL" 
     } else { 
      value = string(col) //ATTN : converted to string here 
     } 
     fmt.Println(columns[i], ": ", value) 
    } 
    fmt.Println("-----------------------------------") 
} 

Есть ли способ, чтобы сохранить его как interface{}, так что я могу сделать необходимый тип отливку, используя столбцы из []map[string]interface{}

+2

Это лучше использовать-структуру, если вы знаете структуру вашей базы данных. –

+1

Вы изучили этот вопрос (http://stackoverflow.com/questions/17840963/create-a-map-in-golang-from-database-rows)? –

+0

@PravinMishra Да, ответ на вопрос (http://stackoverflow.com/questions/17840963/create-a-map-in-golang-from-database-rows) - это то, что я делаю прямо сейчас, но мой интерфейс { } - все строки, потому что я делаю строку (col), которую хочу избежать, поскольку она бросает вызов концепциям типа. Использование struct является допустимой альтернативой, если я не могу ничего сделать, я пойду с альтернативой структуры –

ответ

2

См. this https://stackoverflow.com/questions/20271123/go-lang-sql-in-parameters Ответ, на который мой ответ основан. Пользуясь тем, что вы можете сделать что-то вроде этого:

var myMap = make(map[string]interface{}) 
rows, err := db.Query("SELECT * FROM myTable") 
defer rows.Close() 
if err != nil { 
    log.Fatal(err) 
} 
colNames, err := rows.Columns() 
if err != nil { 
    log.Fatal(err) 
} 
cols := make([]interface{}, len(colNames)) 
colPtrs := make([]interface{}, len(colNames)) 
for i := 0; i < len(colNames); i++ { 
    colPtrs[i] = &cols[i] 
} 
for rows.Next() { 
    err = rows.Scan(colPtrs...) 
    if err != nil { 
     log.Fatal(err) 
    } 
    for i, col := range cols { 
     myMap[colNames[i]] = col 
    } 
    // Do something with the map 
    for key, val := range myMap { 
     fmt.Println("Key:", key, "Value Type:", reflect.TypeOf(val)) 
    } 
} 

Использование отражают пакет, который вы можете получить тип для каждого столбца, по мере необходимости, как показано с петлей на конце.

Это общее и будет работать с любой таблицей, число столбцов и т.д.

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