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!