diff options
Diffstat (limited to 'src/database/sql/example_test.go')
| -rw-r--r-- | src/database/sql/example_test.go | 187 |
1 files changed, 180 insertions, 7 deletions
diff --git a/src/database/sql/example_test.go b/src/database/sql/example_test.go index ce56ca4cb0..da938b071a 100644 --- a/src/database/sql/example_test.go +++ b/src/database/sql/example_test.go @@ -5,43 +5,65 @@ package sql_test import ( + "context" "database/sql" "fmt" "log" + "strings" + "time" ) +var ctx = context.Background() var db *sql.DB -func ExampleDB_Query() { +func ExampleDB_QueryContext() { age := 27 - rows, err := db.Query("SELECT name FROM users WHERE age=?", age) + rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age) if err != nil { log.Fatal(err) } defer rows.Close() + names := make([]string, 0) for rows.Next() { var name string if err := rows.Scan(&name); err != nil { log.Fatal(err) } - fmt.Printf("%s is %d\n", name, age) + names = append(names, name) } if err := rows.Err(); err != nil { log.Fatal(err) } + fmt.Printf("%s are %d years old", strings.Join(names, ", "), age) } -func ExampleDB_QueryRow() { +func ExampleDB_QueryRowContext() { id := 123 var username string - err := db.QueryRow("SELECT username FROM users WHERE id=?", id).Scan(&username) + var created time.Time + err := db.QueryRowContext(ctx, "SELECT username, created_at FROM users WHERE id=?", id).Scan(&username, &created) switch { case err == sql.ErrNoRows: - log.Printf("No user with that ID.") + log.Printf("No user with id %d", id) case err != nil: log.Fatal(err) default: - fmt.Printf("Username is %s\n", username) + fmt.Printf("Username is %s, account created on %s\n", username, created) + } +} + +func ExampleDB_ExecContext() { + id := 47 + result, err := db.ExecContext(ctx, "UPDATE balances SET balance = balance + 10 WHERE user_id = ?", id) + if err != nil { + log.Fatal(err) + } + rows, err := result.RowsAffected() + if err != nil { + log.Fatal(err) + } + if rows != 1 { + panic(err) } } @@ -106,3 +128,154 @@ from log.Fatal(err) } } + +func ExampleDB_PingContext() { + ctx, cancel := context.WithTimeout(ctx, 1*time.Second) + defer cancel() + if err := db.PingContext(ctx); err != nil { + log.Fatal(err) + } +} + +func ExampleConn_BeginTx() { + tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}) + if err != nil { + log.Fatal(err) + } + id := 37 + _, execErr := tx.Exec(`UPDATE users SET status = ? WHERE id = ?`, "paid", id) + if execErr != nil { + _ = tx.Rollback() + log.Fatal(execErr) + } + if err := tx.Commit(); err != nil { + log.Fatal(err) + } +} + +func ExampleConn_ExecContext() { + // A *DB is a pool of connections. Call Conn to reserve a connection for + // exclusive use. + conn, err := db.Conn(ctx) + if err != nil { + log.Fatal(err) + } + defer conn.Close() // Return the connection to the pool. + id := 41 + result, err := conn.ExecContext(ctx, `UPDATE balances SET balance = balance + 10 WHERE user_id = ?`, id) + if err != nil { + log.Fatal(err) + } + rows, err := result.RowsAffected() + if err != nil { + log.Fatal(err) + } + if rows != 1 { + panic(err) + } +} + +func ExampleTx_ExecContext() { + tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}) + if err != nil { + log.Fatal(err) + } + id := 37 + _, execErr := tx.ExecContext(ctx, "UPDATE users SET status = ? WHERE id = ?", "paid", id) + if execErr != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + log.Printf("Could not roll back: %v\n", rollbackErr) + } + log.Fatal(execErr) + } + if err := tx.Commit(); err != nil { + log.Fatal(err) + } +} + +func ExampleTx_Rollback() { + tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}) + if err != nil { + log.Fatal(err) + } + id := 53 + _, err = tx.ExecContext(ctx, "UPDATE drivers SET status = ? WHERE id = ?", "assigned", id) + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + log.Printf("Could not roll back: %v\n", rollbackErr) + } + log.Fatal(err) + } + _, err = tx.ExecContext(ctx, "UPDATE pickups SET driver_id = $1", id) + if err != nil { + if rollbackErr := tx.Rollback(); rollbackErr != nil { + log.Printf("Could not roll back: %v\n", rollbackErr) + } + log.Fatal(err) + } + if err := tx.Commit(); err != nil { + log.Fatal(err) + } +} + +func ExampleStmt() { + // In normal use, create one Stmt when your process starts. + stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?") + if err != nil { + log.Fatal(err) + } + defer stmt.Close() + // Then reuse it each time you need to issue the query. + id := 43 + var username string + err = stmt.QueryRowContext(ctx, id).Scan(&username) + switch { + case err == sql.ErrNoRows: + log.Printf("No user with that ID.") + case err != nil: + log.Fatal(err) + default: + fmt.Printf("Username is %s\n", username) + } +} + +func ExampleStmt_QueryRowContext() { + // In normal use, create one Stmt when your process starts. + stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?") + if err != nil { + log.Fatal(err) + } + // Then reuse it each time you need to issue the query. + id := 43 + var username string + err = stmt.QueryRowContext(ctx, id).Scan(&username) + switch { + case err == sql.ErrNoRows: + log.Printf("No user with that ID.") + case err != nil: + log.Fatal(err) + default: + fmt.Printf("Username is %s\n", username) + } +} + +func ExampleRows() { + age := 27 + rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age) + if err != nil { + log.Fatal(err) + } + defer rows.Close() + names := make([]string, 0) + for rows.Next() { + var name string + if err := rows.Scan(&name); err != nil { + log.Fatal(err) + } + names = append(names, name) + } + if err := rows.Err(); err != nil { + log.Fatal(err) + } + fmt.Printf("%s are %d years old", strings.Join(names, ", "), age) +} |
