new QueryData using generic Scanner interface (for assigning struct items)
This commit is contained in:
parent
d86ab50a41
commit
53f91b4875
2 changed files with 32 additions and 5 deletions
|
@ -10,7 +10,10 @@ type Cfg struct {
|
||||||
Driver, Connstr string
|
Driver, Connstr string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Rows = sql.Rows
|
||||||
|
|
||||||
type rowsProc = func(*sql.Rows) error
|
type rowsProc = func(*sql.Rows) error
|
||||||
|
type Scanner interface{ Scan(*Rows) (Scanner, error) }
|
||||||
|
|
||||||
type Storage struct {
|
type Storage struct {
|
||||||
*sql.DB
|
*sql.DB
|
||||||
|
@ -25,7 +28,20 @@ func Open(cfg *Cfg) *Storage {
|
||||||
return &Storage{db}
|
return &Storage{db}
|
||||||
}
|
}
|
||||||
|
|
||||||
func QueryData[T any](db *Storage, q string, args ...interface{}) []T {
|
func QueryData[T Scanner](db *Storage, q string, args ...interface{}) []T {
|
||||||
|
var data []T
|
||||||
|
proc := func(r *sql.Rows) error {
|
||||||
|
var rec T
|
||||||
|
r1, err := rec.Scan(r)
|
||||||
|
rec = r1.(T)
|
||||||
|
data = append(data, rec)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
db.Query(proc, q, args...) // ?? check error
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func QueryCol[T any](db *Storage, q string, args ...interface{}) []T {
|
||||||
var data []T
|
var data []T
|
||||||
proc := func(r *sql.Rows) error {
|
proc := func(r *sql.Rows) error {
|
||||||
var rec T
|
var rec T
|
||||||
|
@ -33,7 +49,7 @@ func QueryData[T any](db *Storage, q string, args ...interface{}) []T {
|
||||||
data = append(data, rec)
|
data = append(data, rec)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
db.Query(proc, q, args...)
|
db.Query(proc, q, args...) // ?? check error
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,23 @@ func DoTests(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
||||||
t.Run("base", func(t *testing.T) { BaseTest(t, cfg, db) })
|
t.Run("base", func(t *testing.T) { BaseTest(t, cfg, db) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type greet struct {
|
||||||
|
id int64
|
||||||
|
label string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g greet) Scan(rows *sql.Rows) (sql.Scanner, error) {
|
||||||
|
err := rows.Scan(&g.id, &g.label)
|
||||||
|
return g, err
|
||||||
|
}
|
||||||
|
|
||||||
func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
func BaseTest(t *testing.T, cfg *sql.Cfg, db *sql.Storage) {
|
||||||
//fmt.Println(cfg.Connstr)
|
//fmt.Println(cfg.Connstr)
|
||||||
db.Exec(insert)
|
db.Exec(insert)
|
||||||
data := sql.QueryData[string](db, query, 2)
|
//data := sql.QueryCol[string](db, query, 2)
|
||||||
|
data := sql.QueryData[greet](db, query, 2)
|
||||||
t.AssertEqual(len(data), 1)
|
t.AssertEqual(len(data), 1)
|
||||||
t.AssertEqual(data[0], "Good Afternoon")
|
t.AssertEqual(data[0].label, "Good Afternoon")
|
||||||
}
|
}
|
||||||
|
|
||||||
func resetSqlite(db *sql.Storage) {
|
func resetSqlite(db *sql.Storage) {
|
||||||
|
@ -56,7 +67,7 @@ var insert = `insert into test (label) values
|
||||||
('Hello World'),
|
('Hello World'),
|
||||||
('Good Afternoon')`
|
('Good Afternoon')`
|
||||||
|
|
||||||
var query = `select label from test
|
var query = `select id, label from test
|
||||||
where id = $1`
|
where id = $1`
|
||||||
|
|
||||||
// database-specific SQL statements
|
// database-specific SQL statements
|
||||||
|
|
Loading…
Add table
Reference in a new issue