Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Example of working with Go's database/sql and NULL fields
CREATE TABLE books (
isbn char(14) NOT NULL,
title varchar(255),
author varchar(255),
price decimal(5,2)
);
INSERT INTO books (isbn, title, author, price) VALUES
('978-1503261969', 'Emma', 'Jayne Austen', 9.44),
('978-1514274873', 'Journal of a Soldier', NULL, 5.49),
('978-1503379640', 'The Prince', 'Niccolò Machiavelli', NULL);
package main
import (
_ "github.com/lib/pq"
"database/sql"
"fmt"
"log"
)
type Book struct {
Isbn string
Title sql.NullString
Author sql.NullString
Price sql.NullFloat64
}
func main() {
db, err := sql.Open("postgres", "postgres://user:pass@localhost/bookstore")
if err != nil {
log.Fatal(err)
}
defer db.Close()
rows, err := db.Query("SELECT * FROM books")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
bks := make([]*Book, 0)
for rows.Next() {
bk := new(Book)
err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
if err != nil {
log.Fatal(err)
}
bks = append(bks, bk)
}
if err = rows.Err(); err != nil {
log.Fatal(err)
}
for _, bk := range bks {
var price string
if bk.Price.Valid {
price = fmt.Sprintf("£%.2f", bk.Price.Float64)
} else {
price = "PRICE NOT SET"
}
fmt.Printf("%s, %s, %s, %s\n", bk.Isbn, bk.Title.String, bk.Author.String, price)
}
}
// Should output:
// 978-1503261969, Emma, Jayne Austen, £9.44
// 978-1514274873, Journal of a Soldier, , £5.49
// 978-1503379640, The Prince, Niccolò Machiavelli, PRICE NOT SET
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.