The pgx Files 06: Select
14 Aug 2016
Welcome back to The pgx Files! We are still using the users table we created in part two. Today, we look at selecting a single row from a table using pgx.
Here are the contents of our users table from last time, as seen from a psql session:
# select * from users; ┌──────────────────────────────────────┬──────────┬──────────┬────────────┬───────────┐ │ id │ username │ password │ first_name │ last_name │ ├──────────────────────────────────────┼──────────┼──────────┼────────────┼───────────┤ │ 3a6d8008-fec2-412d-acc6-2767a950c5e7 │ manni │ foo │ Manni │ Wood │ └──────────────────────────────────────┴──────────┴──────────┴────────────┴───────────┘ (1 row)
Here's how to fetch a user, and deal with expected errors (user not found) versues unexpected errors (everything else).
package main import ( "fmt" "log" "os" "github.com/jackc/pgx" "github.com/manniwood/playground/pgxfiles" "github.com/satori/go.uuid" ) func main() { if len(os.Args) != 2 { log.Fatal("Please enter a user id (UUID)") } user_id := os.Args[1] id, err := uuid.FromString(user_id) if err != nil { fmt.Fprintf(os.Stderr, "This is not a UUID: \"%s\".\n", user_id) os.Exit(1) } conn := util.Connect("user fetcher") defer conn.Close() var username string var password string var firstName string var lastName string err = conn.QueryRow(` select username, password, first_name, last_name from users where id = $1`, id).Scan(&username, &password, &firstName, &lastName) if err != nil { if err == pgx.ErrNoRows { fmt.Fprintf(os.Stderr, "User with id %s not found.\n", id) } else { fmt.Fprintf(os.Stderr, "Unexpected error trying to find user: %v\n", err) } os.Exit(1) } fmt.Printf("Found user %s %s\n", firstName, lastName) }
$ ./getuser 3a6d8008-fec2-412d-acc6-2767a950c5e7 Found user Manni Wood
$ ./getuser 3a6d8008-fec2-412d-acc6-000000000000 User with id 3a6d8008-fec2-412d-acc6-000000000000 not found.
Pretty straightforward stuff!
Next on The pgx Files: only querying for the data you need!