Documentation
¶
Overview ¶
Package sqlscan allows scanning data into Go structs and other composite types, when working with database/sql library.
Essentially, sqlscan is a wrapper around github.com/georgysavva/scany/dbscan package. sqlscan connects database/sql with dbscan functionality. It contains adapters that are meant to work with *sql.Rows and proxy all calls to dbscan. sqlscan mirrors all capabilities provided by dbscan. It's encouraged to read dbscan docs first to get familiar with all concepts and features: https://pkg.go.dev/github.com/georgysavva/scany/dbscan
How to use ¶
The most common way to work with sqlscan is to call Select or Get functions.
Use Select to query multiple records:
type User struct {
ID string
Name string
Email string
Age int
}
db, _ := sql.Open("postgres", "example-connection-url")
var users []*User
sqlscan.Select(ctx, db, &users, `SELECT id, name, email, age FROM users`)
// users variable now contains data from all rows.
Use Get to query exactly one record:
type User struct {
ID string
Name string
Email string
Age int
}
db, _ := sql.Open("postgres", "example-connection-url")
var user User
sqlscan.Get(ctx, db, &user, `SELECT id, name, email, age FROM users WHERE id='bob'`)
// user variable now contains data from the single row.
Index ¶
- func Get(ctx context.Context, db Querier, dst interface{}, query string, ...) error
- func NotFound(err error) bool
- func ScanAll(dst interface{}, rows *sql.Rows) error
- func ScanOne(dst interface{}, rows *sql.Rows) error
- func ScanRow(dst interface{}, rows *sql.Rows) error
- func Select(ctx context.Context, db Querier, dst interface{}, query string, ...) error
- type Querier
- type RowScanner
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Get ¶ added in v0.2.0
Get is a high-level function that queries rows and calls the ScanOne function. See ScanOne for details.
Example ¶
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
db, _ := sql.Open("postgres", "example-connection-url")
var user User
if err := sqlscan.Get(
ctx, db, &user, `SELECT user_id, name, email, age FROM users WHERE user_id='bob'`,
); err != nil {
// Handle query or rows processing error.
}
// user variable now contains data from all rows.
func NotFound ¶
NotFound is a wrapper around the dbscan.NotFound function. See dbscan.NotFound for details.
func ScanAll ¶
ScanAll is a wrapper around the dbscan.ScanAll function. See dbscan.ScanAll for details.
Example ¶
package main
import (
"database/sql"
"github.com/georgysavva/scany/sqlscan"
)
func main() {
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
// Query *sql.Rows from the database.
db, _ := sql.Open("postgres", "example-connection-url")
rows, _ := db.Query(`SELECT user_id, name, email, age FROM users`)
var users []*User
if err := sqlscan.ScanAll(&users, rows); err != nil {
// Handle rows processing error
}
// users variable now contains data from all rows.
}
func ScanOne ¶
ScanOne is a wrapper around the dbscan.ScanOne function. See dbscan.ScanOne for details.
Example ¶
package main
import (
"database/sql"
"github.com/georgysavva/scany/sqlscan"
)
func main() {
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
// Query *sql.Rows from the database.
db, _ := sql.Open("postgres", "example-connection-url")
rows, _ := db.Query(`SELECT user_id, name, email, age FROM users WHERE user_id='bob'`)
var user User
if err := sqlscan.ScanOne(&user, rows); err != nil {
// Handle rows processing error.
}
// user variable now contains data from the single row.
}
func ScanRow ¶
ScanRow is a wrapper around the dbscan.ScanRow function. See dbscan.ScanRow for details.
Example ¶
package main
import (
"database/sql"
"github.com/georgysavva/scany/sqlscan"
)
func main() {
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
// Query *sql.Rows from the database.
db, _ := sql.Open("postgres", "example-connection-url")
rows, _ := db.Query(`SELECT user_id, name, email, age FROM users`)
defer rows.Close()
for rows.Next() {
var user User
if err := sqlscan.ScanRow(&user, rows); err != nil {
// Handle row scanning error.
}
// user variable now contains data from the current row.
}
if err := rows.Err(); err != nil {
// Handle rows final error.
}
}
func Select ¶ added in v0.2.0
func Select(ctx context.Context, db Querier, dst interface{}, query string, args ...interface{}) error
Select is a high-level function that queries rows and calls the ScanAll function. See ScanAll for details.
Example ¶
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
db, _ := sql.Open("postgres", "example-connection-url")
var users []*User
if err := sqlscan.Select(
ctx, db, &users, `SELECT user_id, name, email, age FROM users`,
); err != nil {
// Handle query or rows processing error.
}
// users variable now contains data from all rows.
Types ¶
type Querier ¶
type Querier interface {
QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
}
Querier is something that sqlscan can query and get the *sql.Rows from. For example, it can be: *sql.DB, *sql.Conn or *sql.Tx.
type RowScanner ¶
type RowScanner struct {
*dbscan.RowScanner
}
RowScanner is a wrapper around the dbscan.RowScanner type. See dbscan.RowScanner for details.
Example ¶
package main
import (
"database/sql"
"github.com/georgysavva/scany/sqlscan"
)
func main() {
type User struct {
ID string `db:"user_id"`
Name string
Email string
Age int
}
// Query *sql.Rows from the database.
db, _ := sql.Open("postgres", "example-connection-url")
rows, _ := db.Query(`SELECT user_id, name, email, age FROM users`)
defer rows.Close()
rs := sqlscan.NewRowScanner(rows)
for rows.Next() {
var user User
if err := rs.Scan(&user); err != nil {
// Handle row scanning error.
}
// user variable now contains data from the current row.
}
if err := rows.Err(); err != nil {
// Handle rows final error.
}
}
func NewRowScanner ¶
func NewRowScanner(rows *sql.Rows) *RowScanner
NewRowScanner returns a new RowScanner instance.