From bdaa5aa59bd7cfe54e6c40cb5080af0bde4f8e03 Mon Sep 17 00:00:00 2001 From: Dennis Schoepf Date: Fri, 26 Apr 2024 22:46:14 +0200 Subject: [PATCH] Sets up sqlc --- database/db.go | 31 +++++++++++++++++++++++ database/migrations/1_initial.sql | 9 +++++++ database/models.go | 11 +++++++++ database/queries/users.sql | 2 ++ database/repository.go | 41 +++++++++++++++++++++++++++++++ database/users.sql.go | 37 ++++++++++++++++++++++++++++ 6 files changed, 131 insertions(+) create mode 100644 database/db.go create mode 100644 database/migrations/1_initial.sql create mode 100644 database/models.go create mode 100644 database/queries/users.sql create mode 100644 database/repository.go create mode 100644 database/users.sql.go diff --git a/database/db.go b/database/db.go new file mode 100644 index 0000000..a3cc795 --- /dev/null +++ b/database/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 + +package database + +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/database/migrations/1_initial.sql b/database/migrations/1_initial.sql new file mode 100644 index 0000000..e50fa0c --- /dev/null +++ b/database/migrations/1_initial.sql @@ -0,0 +1,9 @@ +-- +migrate Up +CREATE table users ( + id INTEGER PRIMARY KEY, + first_name text NOT NULL, + email text NOT NULL +); + +-- +migrate Down +DROP TABLE users; diff --git a/database/models.go b/database/models.go new file mode 100644 index 0000000..5520ca5 --- /dev/null +++ b/database/models.go @@ -0,0 +1,11 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 + +package database + +type User struct { + ID int64 + FirstName string + Email string +} diff --git a/database/queries/users.sql b/database/queries/users.sql new file mode 100644 index 0000000..dba5df7 --- /dev/null +++ b/database/queries/users.sql @@ -0,0 +1,2 @@ +-- name: ListUsers :many +SELECT * FROM users; diff --git a/database/repository.go b/database/repository.go new file mode 100644 index 0000000..ecf5e17 --- /dev/null +++ b/database/repository.go @@ -0,0 +1,41 @@ +package database + +import ( + "database/sql" + "embed" + "fmt" + + _ "github.com/mattn/go-sqlite3" + migrate "github.com/rubenv/sql-migrate" +) + +type Repository struct { + queries *Queries + db *sql.DB +} + +//go:embed migrations/* +var dbMigrations embed.FS + +func NewRepository(filename string) (*Repository, error) { + db, err := sql.Open("sqlite3", filename) + + if err != nil { + return nil, err + } + + migrations := migrate.EmbedFileSystemMigrationSource{ + FileSystem: dbMigrations, + Root: "migrations", + } + + n, err := migrate.Exec(db, "sqlite3", migrations, migrate.Up) + + if err != nil { + return nil, err + } + + fmt.Printf("Applied %d migrations - Database is ready!\n", n) + + return &Repository{queries: New(db), db: db}, nil +} diff --git a/database/users.sql.go b/database/users.sql.go new file mode 100644 index 0000000..6f2b23b --- /dev/null +++ b/database/users.sql.go @@ -0,0 +1,37 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.26.0 +// source: users.sql + +package database + +import ( + "context" +) + +const listAuthors = `-- name: ListAuthors :many +SELECT id, first_name, email FROM users +` + +func (q *Queries) ListAuthors(ctx context.Context) ([]User, error) { + rows, err := q.db.QueryContext(ctx, listAuthors) + 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.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 +}