-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.go
127 lines (114 loc) · 2.41 KB
/
app.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"context"
"database/sql"
"fmt"
"log"
"os"
_ "modernc.org/sqlite"
)
type Album struct {
Title string
Artist string
Price float32
}
type AlbumDbRow struct {
ID int
Album
}
var db *sql.DB
func initDatabase(dbPath string) error {
var err error
db, err = sql.Open("sqlite", dbPath)
if err != nil {
return err
}
_, err = db.ExecContext(
context.Background(),
`DROP TABLE IF EXISTS album;
CREATE TABLE album (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
artist TEXT NOT NULL,
price REAL NOT NULL
)`,
)
if err != nil {
return err
}
return nil
}
func addAlbum(a *Album) (int64, error) {
result, err := db.ExecContext(
context.Background(),
`INSERT INTO album (title, artist, price) VALUES (?,?,?);`, a.Title, a.Artist, a.Price,
)
id, err := result.LastInsertId()
if err != nil {
return 0, err
}
return id, nil
}
func albumsByArtist(artist string) ([]AlbumDbRow, error) {
var albums []AlbumDbRow
rows, err := db.QueryContext(
context.Background(),
`SELECT * FROM album WHERE artist=?;`, artist,
)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var album AlbumDbRow
if err := rows.Scan(
&album.ID, &album.Title, &album.Artist, &album.Price,
); err != nil {
return nil, err
}
albums = append(albums, album)
}
return albums, err
}
func albumByID(id int) (AlbumDbRow, error) {
var album AlbumDbRow
row := db.QueryRowContext(
context.Background(),
`SELECT * FROM album WHERE id=?`, id,
)
err := row.Scan(&album.ID, &album.Title, &album.Artist, &album.Price)
if err != nil {
return album, err
}
return album, nil
}
func main() {
dbPath := os.Getenv("SQLITE_DB_PATH")
if len(dbPath) == 0 {
log.Fatal("specify the SQLITE_DB_PATH environment variable")
}
err := initDatabase(dbPath)
if err != nil {
log.Fatal("error initializing DB connection: ", err)
}
err = db.Ping()
if err != nil {
log.Fatal("error initializing DB connection: ping error: ", err)
}
fmt.Println("database initialized..")
err = insertTestData()
if err != nil {
log.Fatal("error inserting test data: ", err)
}
fmt.Println("test data inserted..")
fmt.Println("querying test data by album ID..")
// query back each record with IDs 1 - 4
for i := 1; i <= 4; i++ {
album, err := albumByID(i)
if err != nil {
fmt.Printf("error querying album ID: %d, %s\n", i, err)
} else {
fmt.Printf("%v\n", album)
}
}
}