sqlscan

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 13, 2020 License: MIT Imports: 4 Imported by: 29

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.

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 {
	UserID string
	Name   string
	Email  string
	Age    int
}

db, _ := sql.Open("postgres", "example-connection-url")

var users []*User
sqlscan.Select(ctx, db, &users, `SELECT user_id, name, email, age FROM users`)
// users variable now contains data from all rows.

Use Get to query exactly one record:

type User struct {
	UserID string
	Name   string
	Email  string
	Age    int
}

db, _ := sql.Open("postgres", "example-connection-url")

var user User
sqlscan.Get(ctx, db, &user, `SELECT user_id, name, email, age FROM users WHERE user_id='bob'`)
// user variable now contains data from the single row.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Get added in v0.2.0

func Get(ctx context.Context, db Querier, dst interface{}, query string, args ...interface{}) error

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

func NotFound(err error) bool

NotFound is a wrapper around the dbscan.NotFound function. See dbscan.NotFound for details.

func ScanAll

func ScanAll(dst interface{}, rows *sql.Rows) error

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

func ScanOne(dst interface{}, rows *sql.Rows) error

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

func ScanRow(dst interface{}, rows *sql.Rows) error

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`)

	// Make sure rows are always closed.
	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`)

	// Make sure rows are always closed.
	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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL