2014-01-06 3 views
1

В Документах Go SQL они дают пример here из запроса, который возвращает только один столбец (плохой пример, на мой взгляд, по крайней мере возвращения 2 ...)Go Использование db.Query вернуть более одного столбца

age := 27 
rows, err := db.Query("SELECT name FROM users WHERE age=?", age) 
if err != nil { 
     log.Fatal(err) 
} 
for rows.Next() { 
     var name string 
     if err := rows.Scan(&name); err != nil { 
       log.Fatal(err) 
     } 
     fmt.Printf("%s is %d\n", name, age) 
} 
if err := rows.Err(); err != nil { 
     log.Fatal(err) 
} 

Состояние документов here, что Сканирование копирует столбцы в текущей строке в значения, указанные в dest.

Как это работает с структурой, позволяет сказать, у меня есть на структуру

type User struct{ 
    Name string 
    Age int 
} 

и я изменить мой запрос SELECT name, age from users where age=?

Как распаковать * Ряды в мои структуры? Я действительно нашел пример this, но он не касался структур. Я буду следовать за соглашениями о шаблонах Active Record, поэтому мои структуры будут отображаться в моей базе данных с помощью преобразования кода змеи.

+1

https://github.com/jmoiron/sqlx может помочь упростить это. – elithrar

+0

@elithrar спасибо, что я искал – Lee

ответ

4

Глядя на the source, кажется, копия делается с ... синтаксиса на указатели назначения:

func (rs *Rows) Scan(dest ...interface{}) error 

Таким образом, в вашем примере, вы можете сделать, например:

for rows.Next() { 
    u := User{} // An empty user 
    ... 
    if err := rows.Scan(&u.Name, &u.Age); err != nil { 
     ... 
    } 
} 

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

+0

Если я сначала выбрал возраст, а затем имя, например. выберите возраст, имя будет выше, значит, это порядковый номер? – Lee

+0

Я так считаю, да. Если вы хотите инвертировать запрос, вызов 'err: = convertAssign (dest [i], sv)' завершится неудачно, и метод 'row.Scan' вернет ошибку, поскольку он не может преобразовать' int' в 'string ' – val

+0

Это делает невозможным сделать это с отражением, поскольку вы не можете гарантировать, что поля модели находятся в порядковой синхронизации со столбцами базы данных (ну, не будучи педантичным и непрактичным) – Lee

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