| | |
| | |
| | |
| |
|
| | package sql_test |
| |
|
| | import ( |
| | "context" |
| | "database/sql" |
| | "flag" |
| | "log" |
| | "os" |
| | "os/signal" |
| | "time" |
| | ) |
| |
|
| | var pool *sql.DB |
| |
|
| | func Example_openDBCLI() { |
| | id := flag.Int64("id", 0, "person ID to find") |
| | dsn := flag.String("dsn", os.Getenv("DSN"), "connection data source name") |
| | flag.Parse() |
| |
|
| | if len(*dsn) == 0 { |
| | log.Fatal("missing dsn flag") |
| | } |
| | if *id == 0 { |
| | log.Fatal("missing person ID") |
| | } |
| | var err error |
| |
|
| | |
| | pool, err = sql.Open("driver-name", *dsn) |
| | if err != nil { |
| | |
| | |
| | log.Fatal("unable to use data source name", err) |
| | } |
| | defer pool.Close() |
| |
|
| | pool.SetConnMaxLifetime(0) |
| | pool.SetMaxIdleConns(3) |
| | pool.SetMaxOpenConns(3) |
| |
|
| | ctx, stop := context.WithCancel(context.Background()) |
| | defer stop() |
| |
|
| | appSignal := make(chan os.Signal, 3) |
| | signal.Notify(appSignal, os.Interrupt) |
| |
|
| | go func() { |
| | <-appSignal |
| | stop() |
| | }() |
| |
|
| | Ping(ctx) |
| |
|
| | Query(ctx, *id) |
| | } |
| |
|
| | |
| | |
| | func Ping(ctx context.Context) { |
| | ctx, cancel := context.WithTimeout(ctx, 1*time.Second) |
| | defer cancel() |
| |
|
| | if err := pool.PingContext(ctx); err != nil { |
| | log.Fatalf("unable to connect to database: %v", err) |
| | } |
| | } |
| |
|
| | |
| | |
| | func Query(ctx context.Context, id int64) { |
| | ctx, cancel := context.WithTimeout(ctx, 5*time.Second) |
| | defer cancel() |
| |
|
| | var name string |
| | err := pool.QueryRowContext(ctx, "select p.name from people as p where p.id = :id;", sql.Named("id", id)).Scan(&name) |
| | if err != nil { |
| | log.Fatal("unable to execute search query", err) |
| | } |
| | log.Println("name=", name) |
| | } |
| |
|