From a6e4b77bbbf5595648074979ee375c3259d0c5d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Krop=C3=A1=C4=8Dek?= Date: Sat, 16 Nov 2024 08:34:02 +0100 Subject: [PATCH] WiP --- dbconfig.yml | 4 ++ go.mod | 2 + go.sum | 2 + internal/queries/db.go | 31 +++++++++++ internal/queries/models.go | 12 +++++ internal/queries/user.sql.go | 74 +++++++++++++++++++++++++++ main.go | 35 ++++++++++++- migrations/20241114201119-initial.sql | 10 ++++ queries/user.sql | 9 ++++ sqlc.yaml | 9 ++++ 10 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 dbconfig.yml create mode 100644 go.sum create mode 100644 internal/queries/db.go create mode 100644 internal/queries/models.go create mode 100644 internal/queries/user.sql.go create mode 100644 migrations/20241114201119-initial.sql create mode 100644 queries/user.sql create mode 100644 sqlc.yaml diff --git a/dbconfig.yml b/dbconfig.yml new file mode 100644 index 0000000..5bf6db9 --- /dev/null +++ b/dbconfig.yml @@ -0,0 +1,4 @@ +development: + dialect: sqlite3 + datasource: test.db + dir: migrations/ diff --git a/go.mod b/go.mod index 7955c16..2eee33b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module git.katuwoss.dev/JustScreaMy/secret-santa go 1.23.2 + +require github.com/mattn/go-sqlite3 v1.14.24 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9dcdc9b --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= diff --git a/internal/queries/db.go b/internal/queries/db.go new file mode 100644 index 0000000..1cbab90 --- /dev/null +++ b/internal/queries/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package queries + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/queries/models.go b/internal/queries/models.go new file mode 100644 index 0000000..d87ba4c --- /dev/null +++ b/internal/queries/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 + +package queries + +type User struct { + ID int64 + FirstName string + LastName string + Email string +} diff --git a/internal/queries/user.sql.go b/internal/queries/user.sql.go new file mode 100644 index 0000000..543c51d --- /dev/null +++ b/internal/queries/user.sql.go @@ -0,0 +1,74 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: user.sql + +package queries + +import ( + "context" +) + +const createUser = `-- name: CreateUser :exec +INSERT INTO users (id, email, first_name, last_name) VALUES (NULL, ?, ?, ?) +` + +type CreateUserParams struct { + Email string + FirstName string + LastName string +} + +func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) error { + _, err := q.db.ExecContext(ctx, createUser, arg.Email, arg.FirstName, arg.LastName) + return err +} + +const getUserId = `-- name: GetUserId :one +SELECT id, first_name, last_name, email FROM users +WHERE id = ? LIMIT 1 +` + +func (q *Queries) GetUserId(ctx context.Context, id int64) (User, error) { + row := q.db.QueryRowContext(ctx, getUserId, id) + var i User + err := row.Scan( + &i.ID, + &i.FirstName, + &i.LastName, + &i.Email, + ) + return i, err +} + +const getUsers = `-- name: GetUsers :many +SELECT id, first_name, last_name, email FROM users +` + +func (q *Queries) GetUsers(ctx context.Context) ([]User, error) { + rows, err := q.db.QueryContext(ctx, getUsers) + if err != nil { + return nil, err + } + defer rows.Close() + var items []User + for rows.Next() { + var i User + if err := rows.Scan( + &i.ID, + &i.FirstName, + &i.LastName, + &i.Email, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/main.go b/main.go index 70a7fe5..91c73ee 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,38 @@ package main -import "fmt" +import ( + "context" + "database/sql" + "fmt" + "log" + + "git.katuwoss.dev/JustScreaMy/secret-santa/internal/queries" + _ "github.com/mattn/go-sqlite3" +) func main() { - fmt.Println("Hello world!") + ctx := context.Background() + + dbConnection, err := sql.Open("sqlite3", "./test.db") + if err != nil { + log.Fatal(err) + } + db := queries.New(dbConnection) + + if err := db.CreateUser(ctx, queries.CreateUserParams{ + Email: "jakub.kropacek@olc.cz", + FirstName: "Jakub", + LastName: "Kropáček", + }); err != nil { + log.Fatal(err) + } + + users, err := db.GetUsers(ctx) + if err != nil { + log.Fatal(err) + } + + for _, user := range users { + fmt.Println(user) + } } diff --git a/migrations/20241114201119-initial.sql b/migrations/20241114201119-initial.sql new file mode 100644 index 0000000..e6acc53 --- /dev/null +++ b/migrations/20241114201119-initial.sql @@ -0,0 +1,10 @@ +-- +migrate Up +CREATE TABLE users ( + id INT PRIMARY KEY, + first_name VARCHAR(64) NOT NULL, + last_name VARCHAR(64) NOT NULL, + email VARCHAR(128) NOT NULL +); + +-- +migrate Down +DROP TABLE IF EXISTS users; \ No newline at end of file diff --git a/queries/user.sql b/queries/user.sql new file mode 100644 index 0000000..3f66441 --- /dev/null +++ b/queries/user.sql @@ -0,0 +1,9 @@ +-- name: GetUserId :one +SELECT * FROM users +WHERE id = ? LIMIT 1; + +-- name: GetUsers :many +SELECT * FROM users; + +-- name: CreateUser :exec +INSERT INTO users (id, email, first_name, last_name) VALUES (NULL, ?, ?, ?); \ No newline at end of file diff --git a/sqlc.yaml b/sqlc.yaml new file mode 100644 index 0000000..255f358 --- /dev/null +++ b/sqlc.yaml @@ -0,0 +1,9 @@ +version: "2" +sql: + - engine: sqlite + queries: queries/ + schema: migrations/ + gen: + go: + package: "queries" + out: "internal/queries" \ No newline at end of file