commit b7f9a3e4597202d189c6a2f0083618aad4ebd818 Author: Lucas Schumacher Date: Fri Jun 14 23:02:39 2024 -0400 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e063c3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +db.sqlite3 +dbtest diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7945bfd --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +build: db.sqlite3 + go build dbtest.go + +run: db.sqlite3 + go run dbtest.go + +db.sqlite3: migrations/*.sql + cat migrations/*.sql | sqlite3 db.sqlite3 + +all: build db.sqlite3 + +.PHONY: all build run diff --git a/dbtest.go b/dbtest.go new file mode 100644 index 0000000..3b653e0 --- /dev/null +++ b/dbtest.go @@ -0,0 +1,85 @@ +package main + +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/mattn/go-sqlite3" +) + +var db *sql.DB + +type Album struct { + ID int64 + Title string + Artist string + Price float32 +} +type Test_counter struct { + ID int64 + Counter int64 +} + +func main() { + var err error + db, err = sql.Open("sqlite3", "./db.sqlite3") + if err != nil { + log.Fatal(err) + } + pErr := db.Ping() + if pErr != nil { + log.Fatal(pErr) + } + fmt.Println("Connected!") + + count, err := counterIncrement() + if err != nil { + log.Fatal(err) + } + fmt.Println("You are visitor #", count) + + albums, err := albumsByArtist("John Coltrane") + if err != nil { + log.Fatal(err) + } + fmt.Printf("Albums found: %v\n", albums) +} + +func counterIncrement() (int64, error) { + _, err := db.Exec("UPDATE `test_counter` SET `counter` = `counter`+1 WHERE `id` = 0") + if err != nil { + return 0, fmt.Errorf("counterIncrement: %v", err) + } + + var count int64 + row := db.QueryRow("SELECT counter FROM test_counter WHERE id = 0") + if err := row.Scan(&count); err != nil { + if err == sql.ErrNoRows { + return count, fmt.Errorf("counterIncrement: NO COUNTER") + } + return count, fmt.Errorf("counterIncrement: %v", err) + } + return count, nil +} + +func albumsByArtist(name string) ([]Album, error) { + var albums []Album + + rows, err := db.Query("SELECT * FROM album WHERE artist = ?", name) + if err != nil { + return nil, fmt.Errorf("albumbsByArtist %q: %v", name, err) + } + defer rows.Close() + for rows.Next() { + var alb Album + if err := rows.Scan(&alb.ID, &alb.Title, &alb.Artist, &alb.Price); err != nil { + return nil, fmt.Errorf("albumbsByArtist %q: %v", name, err) + } + albums = append(albums, alb) + } + if err := rows.Err(); err != nil { + return nil, fmt.Errorf("albumbsByArtist %q: %v", name, err) + } + return albums, nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a6799e4 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module example/data-access + +go 1.22.3 + +require github.com/mattn/go-sqlite3 v1.14.22 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e8d092a --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/migrations/0001_add_table_test_counter.sql b/migrations/0001_add_table_test_counter.sql new file mode 100644 index 0000000..8d76b47 --- /dev/null +++ b/migrations/0001_add_table_test_counter.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS test_counter; +CREATE TABLE "test_counter" ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + "counter" integer NOT NULL +); + +INSERT INTO test_counter ( + id, + counter +) VALUES ( 0,0 ); diff --git a/migrations/0002_tutorial_create_tables.sql b/migrations/0002_tutorial_create_tables.sql new file mode 100644 index 0000000..6a2197c --- /dev/null +++ b/migrations/0002_tutorial_create_tables.sql @@ -0,0 +1,8 @@ +DROP TABLE IF EXISTS album; +CREATE TABLE album ( + "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, + title VARCHAR(128) NOT NULL, + artist VARCHAR(255) NOT NULL, + price DECIMAL(5,2) NOT NULL +); + diff --git a/migrations/0003_tutorial_add_data.sql b/migrations/0003_tutorial_add_data.sql new file mode 100644 index 0000000..1cf185a --- /dev/null +++ b/migrations/0003_tutorial_add_data.sql @@ -0,0 +1,7 @@ +INSERT INTO album + (title, artist, price) +VALUES + ('Blue Train', 'John Coltrane', 56.99), + ('Giant Steps', 'John Coltrane', 63.99), + ('Jeru', 'Gerry Mulligan', 17.99), + ('Sarah Vaughan', 'Sarah Vaughan', 34.98);