github.com/zxy12/go_duplicate_112_new@v0.0.0-20200807091221-747231827200/src/database/sql/example_test.go (about)

     1  // Copyright 2013 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package sql_test
     6  
     7  import (
     8  	"context"
     9  	"database/sql"
    10  	"fmt"
    11  	"log"
    12  	"strings"
    13  	"time"
    14  )
    15  
    16  var (
    17  	ctx context.Context
    18  	db  *sql.DB
    19  )
    20  
    21  func ExampleDB_QueryContext() {
    22  	age := 27
    23  	rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age)
    24  	if err != nil {
    25  		log.Fatal(err)
    26  	}
    27  	defer rows.Close()
    28  	names := make([]string, 0)
    29  
    30  	for rows.Next() {
    31  		var name string
    32  		if err := rows.Scan(&name); err != nil {
    33  			// Check for a scan error.
    34  			// Query rows will be closed with defer.
    35  			log.Fatal(err)
    36  		}
    37  		names = append(names, name)
    38  	}
    39  	// If the database is being written to ensure to check for Close
    40  	// errors that may be returned from the driver. The query may
    41  	// encounter an auto-commit error and be forced to rollback changes.
    42  	rerr := rows.Close()
    43  	if rerr != nil {
    44  		log.Fatal(err)
    45  	}
    46  
    47  	// Rows.Err will report the last error encountered by Rows.Scan.
    48  	if err := rows.Err(); err != nil {
    49  		log.Fatal(err)
    50  	}
    51  	fmt.Printf("%s are %d years old", strings.Join(names, ", "), age)
    52  }
    53  
    54  func ExampleDB_QueryRowContext() {
    55  	id := 123
    56  	var username string
    57  	var created time.Time
    58  	err := db.QueryRowContext(ctx, "SELECT username, created_at FROM users WHERE id=?", id).Scan(&username, &created)
    59  	switch {
    60  	case err == sql.ErrNoRows:
    61  		log.Printf("no user with id %d\n", id)
    62  	case err != nil:
    63  		log.Fatalf("query error: %v\n", err)
    64  	default:
    65  		log.Printf("username is %q, account created on %s\n", username, created)
    66  	}
    67  }
    68  
    69  func ExampleDB_ExecContext() {
    70  	id := 47
    71  	result, err := db.ExecContext(ctx, "UPDATE balances SET balance = balance + 10 WHERE user_id = ?", id)
    72  	if err != nil {
    73  		log.Fatal(err)
    74  	}
    75  	rows, err := result.RowsAffected()
    76  	if err != nil {
    77  		log.Fatal(err)
    78  	}
    79  	if rows != 1 {
    80  		log.Fatalf("expected to affect 1 row, affected %d", rows)
    81  	}
    82  }
    83  
    84  func ExampleDB_Query_multipleResultSets() {
    85  	age := 27
    86  	q := `
    87  create temp table uid (id bigint); -- Create temp table for queries.
    88  insert into uid
    89  select id from users where age < ?; -- Populate temp table.
    90  
    91  -- First result set.
    92  select
    93  	users.id, name
    94  from
    95  	users
    96  	join uid on users.id = uid.id
    97  ;
    98  
    99  -- Second result set.
   100  select 
   101  	ur.user, ur.role
   102  from
   103  	user_roles as ur
   104  	join uid on uid.id = ur.user
   105  ;
   106  	`
   107  	rows, err := db.Query(q, age)
   108  	if err != nil {
   109  		log.Fatal(err)
   110  	}
   111  	defer rows.Close()
   112  
   113  	for rows.Next() {
   114  		var (
   115  			id   int64
   116  			name string
   117  		)
   118  		if err := rows.Scan(&id, &name); err != nil {
   119  			log.Fatal(err)
   120  		}
   121  		log.Printf("id %d name is %s\n", id, name)
   122  	}
   123  	if !rows.NextResultSet() {
   124  		log.Fatalf("expected more result sets: %v", rows.Err())
   125  	}
   126  	var roleMap = map[int64]string{
   127  		1: "user",
   128  		2: "admin",
   129  		3: "gopher",
   130  	}
   131  	for rows.Next() {
   132  		var (
   133  			id   int64
   134  			role int64
   135  		)
   136  		if err := rows.Scan(&id, &role); err != nil {
   137  			log.Fatal(err)
   138  		}
   139  		log.Printf("id %d has role %s\n", id, roleMap[role])
   140  	}
   141  	if err := rows.Err(); err != nil {
   142  		log.Fatal(err)
   143  	}
   144  }
   145  
   146  func ExampleDB_PingContext() {
   147  	// Ping and PingContext may be used to determine if communication with
   148  	// the database server is still possible.
   149  	//
   150  	// When used in a command line application Ping may be used to establish
   151  	// that further queries are possible; that the provided DSN is valid.
   152  	//
   153  	// When used in long running service Ping may be part of the health
   154  	// checking system.
   155  
   156  	ctx, cancel := context.WithTimeout(ctx, 1*time.Second)
   157  	defer cancel()
   158  
   159  	status := "up"
   160  	if err := db.PingContext(ctx); err != nil {
   161  		status = "down"
   162  	}
   163  	log.Println(status)
   164  }
   165  
   166  func ExampleConn_BeginTx() {
   167  	tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
   168  	if err != nil {
   169  		log.Fatal(err)
   170  	}
   171  	id := 37
   172  	_, execErr := tx.Exec(`UPDATE users SET status = ? WHERE id = ?`, "paid", id)
   173  	if execErr != nil {
   174  		_ = tx.Rollback()
   175  		log.Fatal(execErr)
   176  	}
   177  	if err := tx.Commit(); err != nil {
   178  		log.Fatal(err)
   179  	}
   180  }
   181  
   182  func ExampleConn_ExecContext() {
   183  	// A *DB is a pool of connections. Call Conn to reserve a connection for
   184  	// exclusive use.
   185  	conn, err := db.Conn(ctx)
   186  	if err != nil {
   187  		log.Fatal(err)
   188  	}
   189  	defer conn.Close() // Return the connection to the pool.
   190  	id := 41
   191  	result, err := conn.ExecContext(ctx, `UPDATE balances SET balance = balance + 10 WHERE user_id = ?;`, id)
   192  	if err != nil {
   193  		log.Fatal(err)
   194  	}
   195  	rows, err := result.RowsAffected()
   196  	if err != nil {
   197  		log.Fatal(err)
   198  	}
   199  	if rows != 1 {
   200  		log.Fatalf("expected single row affected, got %d rows affected", rows)
   201  	}
   202  }
   203  
   204  func ExampleTx_ExecContext() {
   205  	tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
   206  	if err != nil {
   207  		log.Fatal(err)
   208  	}
   209  	id := 37
   210  	_, execErr := tx.ExecContext(ctx, "UPDATE users SET status = ? WHERE id = ?", "paid", id)
   211  	if execErr != nil {
   212  		if rollbackErr := tx.Rollback(); rollbackErr != nil {
   213  			log.Fatalf("update failed: %v, unable to rollback: %v\n", execErr, rollbackErr)
   214  		}
   215  		log.Fatalf("update failed: %v", execErr)
   216  	}
   217  	if err := tx.Commit(); err != nil {
   218  		log.Fatal(err)
   219  	}
   220  }
   221  
   222  func ExampleTx_Rollback() {
   223  	tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})
   224  	if err != nil {
   225  		log.Fatal(err)
   226  	}
   227  	id := 53
   228  	_, err = tx.ExecContext(ctx, "UPDATE drivers SET status = ? WHERE id = ?;", "assigned", id)
   229  	if err != nil {
   230  		if rollbackErr := tx.Rollback(); rollbackErr != nil {
   231  			log.Fatalf("update drivers: unable to rollback: %v", rollbackErr)
   232  		}
   233  		log.Fatal(err)
   234  	}
   235  	_, err = tx.ExecContext(ctx, "UPDATE pickups SET driver_id = $1;", id)
   236  	if err != nil {
   237  		if rollbackErr := tx.Rollback(); rollbackErr != nil {
   238  			log.Fatalf("update failed: %v, unable to back: %v", err, rollbackErr)
   239  		}
   240  		log.Fatal(err)
   241  	}
   242  	if err := tx.Commit(); err != nil {
   243  		log.Fatal(err)
   244  	}
   245  }
   246  
   247  func ExampleStmt() {
   248  	// In normal use, create one Stmt when your process starts.
   249  	stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?")
   250  	if err != nil {
   251  		log.Fatal(err)
   252  	}
   253  	defer stmt.Close()
   254  
   255  	// Then reuse it each time you need to issue the query.
   256  	id := 43
   257  	var username string
   258  	err = stmt.QueryRowContext(ctx, id).Scan(&username)
   259  	switch {
   260  	case err == sql.ErrNoRows:
   261  		log.Fatalf("no user with id %d", id)
   262  	case err != nil:
   263  		log.Fatal(err)
   264  	default:
   265  		log.Printf("username is %s\n", username)
   266  	}
   267  }
   268  
   269  func ExampleStmt_QueryRowContext() {
   270  	// In normal use, create one Stmt when your process starts.
   271  	stmt, err := db.PrepareContext(ctx, "SELECT username FROM users WHERE id = ?")
   272  	if err != nil {
   273  		log.Fatal(err)
   274  	}
   275  	defer stmt.Close()
   276  
   277  	// Then reuse it each time you need to issue the query.
   278  	id := 43
   279  	var username string
   280  	err = stmt.QueryRowContext(ctx, id).Scan(&username)
   281  	switch {
   282  	case err == sql.ErrNoRows:
   283  		log.Fatalf("no user with id %d", id)
   284  	case err != nil:
   285  		log.Fatal(err)
   286  	default:
   287  		log.Printf("username is %s\n", username)
   288  	}
   289  }
   290  
   291  func ExampleRows() {
   292  	age := 27
   293  	rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age=?", age)
   294  	if err != nil {
   295  		log.Fatal(err)
   296  	}
   297  	defer rows.Close()
   298  
   299  	names := make([]string, 0)
   300  	for rows.Next() {
   301  		var name string
   302  		if err := rows.Scan(&name); err != nil {
   303  			log.Fatal(err)
   304  		}
   305  		names = append(names, name)
   306  	}
   307  	// Check for errors from iterating over rows.
   308  	if err := rows.Err(); err != nil {
   309  		log.Fatal(err)
   310  	}
   311  	log.Printf("%s are %d years old", strings.Join(names, ", "), age)
   312  }