Scan is a Go package for scanning database rows into structs or slices of primitive types.
This project is forked from https://github.com/blockloop/scan and adjusted to be generic, while all dependencies are removed.
go get github.com/goapt/scanimport "github.com/goapt/scan"type Person struct {
ID int `db:"id"`
Name string
}
db, err := sql.Open("sqlite3", "database.sqlite")
rows, err := db.Query("SELECT * FROM persons")
defer rows.Close()
persons, err := scan.Rows[Person](rows)
fmt.Printf("%#v", persons)
// []Person{
// {ID: 1, Name: "brett"},
// {ID: 2, Name: "fred"},
// {ID: 3, Name: "stacy"},
// }rows, err := db.Query("SELECT name FROM persons")
defer rows.Close()
names, err := scan.Rows[string](rows)
fmt.Printf("%#v", names)
// []string{
// "brett",
// "fred",
// "stacy",
// }rows, err := db.Query("SELECT * FROM persons where name = 'brett' LIMIT 1")
person, err := scan.Row[Person](rows)
defer rows.Close()
fmt.Printf("%#v", person)
// Person{ ID: 1, Name: "brett" }rows, err := db.Query("SELECT age FROM persons where name = 'brett' LIMIT 1")
defer rows.Close()
age, err := scan.Row[int8](rows)
fmt.Printf("%d", age)
// 100By default, column names are mapped to and from database column names using basic title case conversion. You can override this behavior by setting ScannerMapper to custom functions.
scan.ScannerMapper = func(columnName string) string {
return strings.ToLower(columnName)
}While many other projects support similar features (i.e. sqlx) scan allows you to use any database lib such as the stdlib to write fluent SQL statements and pass the resulting rows to scan for scanning.