mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
database/sql: support returning query database types
Creates a ColumnType structure that can be extended in to future. Allow drivers to implement what makes sense for the database. Fixes #16652 Change-Id: Ieb1fd64eac1460107b1d3474eba5201fa300a4ec Reviewed-on: https://go-review.googlesource.com/29961 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
2ecaaf18f9
commit
2a85578b0e
4 changed files with 259 additions and 11 deletions
|
|
@ -499,6 +499,56 @@ func TestRowsColumns(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestRowsColumnTypes(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
rows, err := db.Query("SELECT|people|age,name|")
|
||||
if err != nil {
|
||||
t.Fatalf("Query: %v", err)
|
||||
}
|
||||
tt, err := rows.ColumnTypes()
|
||||
if err != nil {
|
||||
t.Fatalf("ColumnTypes: %v", err)
|
||||
}
|
||||
|
||||
types := make([]reflect.Type, len(tt))
|
||||
for i, tp := range tt {
|
||||
st := tp.ScanType()
|
||||
if st == nil {
|
||||
t.Errorf("scantype is null for column %q", tp.Name())
|
||||
continue
|
||||
}
|
||||
types[i] = st
|
||||
}
|
||||
values := make([]interface{}, len(tt))
|
||||
for i := range values {
|
||||
values[i] = reflect.New(types[i]).Interface()
|
||||
}
|
||||
ct := 0
|
||||
for rows.Next() {
|
||||
err = rows.Scan(values...)
|
||||
if err != nil {
|
||||
t.Fatalf("failed to scan values in %v", err)
|
||||
}
|
||||
ct++
|
||||
if ct == 0 {
|
||||
if values[0].(string) != "Bob" {
|
||||
t.Errorf("Expected Bob, got %v", values[0])
|
||||
}
|
||||
if values[1].(int) != 2 {
|
||||
t.Errorf("Expected 2, got %v", values[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
if ct != 3 {
|
||||
t.Errorf("expected 3 rows, got %d", ct)
|
||||
}
|
||||
|
||||
if err := rows.Close(); err != nil {
|
||||
t.Errorf("error closing rows: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueryRow(t *testing.T) {
|
||||
db := newTestDB(t, "people")
|
||||
defer closeDB(t, db)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue