Вы можете использовать Rows.Columns, например,
package main
import (
"database/sql"
"fmt"
"github.com/lib/pq"
)
type Vehicle struct {
Id int
Name string
Wheels int
}
// VehicleCol returns a reference for a column of a Vehicle
func VehicleCol(colname string, vh *Vehicle) interface{} {
switch colname {
case "id":
return &vh.Id
case "name":
return &vh.Name
case "wheels":
return &vh.Wheels
default:
panic("unknown column " + colname)
}
}
func panicOnErr(err error) {
if err != nil {
panic(err.Error())
}
}
func main() {
conn, err := pq.ParseURL(`postgres://docker:[email protected]:5432/pgsqltest?schema=public`)
panicOnErr(err)
var db *sql.DB
db, err = sql.Open("postgres", conn)
panicOnErr(err)
var rows *sql.Rows
rows, err = db.Query("select * from vehicle")
panicOnErr(err)
// get the column names from the query
var columns []string
columns, err = rows.Columns()
panicOnErr(err)
colNum := len(columns)
all := []Vehicle{}
for rows.Next() {
vh := Vehicle{}
// make references for the cols with the aid of VehicleCol
cols := make([]interface{}, colNum)
for i := 0; i < colNum; i++ {
cols[i] = VehicleCol(columns[i], &vh)
}
err = rows.Scan(cols...)
panicOnErr(err)
all = append(all, vh)
}
fmt.Printf("%#v\n", all)
}
Он возвращает ссылку sql.Rows. Используйте rows.Next для повторения, пока вы не найдете нужную строку. http://go-database-sql.org/retrieving.html – elithrar
Спасибо @elithrar. Мне жаль, что я не дал понять. Мой вопрос в том, что я хочу только один столбец или два из большого количества столбцов. Есть ли удобный способ сделать это? Либо от имени столбца, либо от имени столбца? –
Я не думаю, что есть удобный способ сделать это с помощью пакета sql. Возможно, посмотрите на jmoiron/sqlx для некоторых расширений sql, которые включают в себя то, что вы пытаетесь сделать. В противном случае sql.Rows предоставляет функцию Columns(), которую вы можете использовать, чтобы идентифицировать cols, который вы хотите. – Alex