浏览代码

Start using sqlc for golink data model

Breandan Dezendorf 2 年之前
父节点
当前提交
2b6dd1a9dc

+ 1 - 0
dezendorf/applications/golink/BUILD.bazel

@@ -0,0 +1 @@
+

+ 31 - 0
dezendorf/applications/golink/internal/database/db.go

@@ -0,0 +1,31 @@
+// Code generated by sqlc. DO NOT EDIT.
+// versions:
+//   sqlc v1.14.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,
+	}
+}

+ 21 - 0
dezendorf/applications/golink/internal/database/models.go

@@ -0,0 +1,21 @@
+// Code generated by sqlc. DO NOT EDIT.
+// versions:
+//   sqlc v1.14.0
+
+package database
+
+import (
+	"database/sql"
+)
+
+type Author struct {
+	ID   int64
+	Name string
+}
+
+type Golink struct {
+	ID         int64
+	Name       string
+	Target     string
+	VisitCount sql.NullInt64
+}

+ 150 - 0
dezendorf/applications/golink/internal/database/query.sql.go

@@ -0,0 +1,150 @@
+// Code generated by sqlc. DO NOT EDIT.
+// versions:
+//   sqlc v1.14.0
+// source: query.sql
+
+package database
+
+import (
+	"context"
+	"database/sql"
+)
+
+const createAuthor = `-- name: CreateAuthor :execresult
+INSERT INTO authors (
+  name
+) VALUES (
+  ?
+)
+`
+
+func (q *Queries) CreateAuthor(ctx context.Context, name string) (sql.Result, error) {
+	return q.db.ExecContext(ctx, createAuthor, name)
+}
+
+const createLink = `-- name: CreateLink :execresult
+INSERT INTO golinks (
+  name, target
+) VALUES (
+  ?, ?
+)
+`
+
+type CreateLinkParams struct {
+	Name   string
+	Target string
+}
+
+func (q *Queries) CreateLink(ctx context.Context, arg CreateLinkParams) (sql.Result, error) {
+	return q.db.ExecContext(ctx, createLink, arg.Name, arg.Target)
+}
+
+const deleteAuthor = `-- name: DeleteAuthor :exec
+DELETE FROM authors
+WHERE id = ?
+`
+
+func (q *Queries) DeleteAuthor(ctx context.Context, id int64) error {
+	_, err := q.db.ExecContext(ctx, deleteAuthor, id)
+	return err
+}
+
+const deleteLink = `-- name: DeleteLink :exec
+DELETE FROM golinks
+WHERE id = ?
+`
+
+func (q *Queries) DeleteLink(ctx context.Context, id int64) error {
+	_, err := q.db.ExecContext(ctx, deleteLink, id)
+	return err
+}
+
+const getAuthor = `-- name: GetAuthor :one
+SELECT id, name FROM authors
+WHERE id = ? LIMIT 1
+`
+
+func (q *Queries) GetAuthor(ctx context.Context, id int64) (Author, error) {
+	row := q.db.QueryRowContext(ctx, getAuthor, id)
+	var i Author
+	err := row.Scan(&i.ID, &i.Name)
+	return i, err
+}
+
+const getLink = `-- name: GetLink :one
+SELECT id, name, target, visit_count FROM golinks
+WHERE name = ? LIMIT 1
+`
+
+func (q *Queries) GetLink(ctx context.Context, name string) (Golink, error) {
+	row := q.db.QueryRowContext(ctx, getLink, name)
+	var i Golink
+	err := row.Scan(
+		&i.ID,
+		&i.Name,
+		&i.Target,
+		&i.VisitCount,
+	)
+	return i, err
+}
+
+const listAuthors = `-- name: ListAuthors :many
+SELECT id, name FROM authors
+ORDER BY name
+`
+
+func (q *Queries) ListAuthors(ctx context.Context) ([]Author, error) {
+	rows, err := q.db.QueryContext(ctx, listAuthors)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Author
+	for rows.Next() {
+		var i Author
+		if err := rows.Scan(&i.ID, &i.Name); 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
+}
+
+const listLinks = `-- name: ListLinks :many
+SELECT id, name, target, visit_count FROM golinks
+ORDER BY name
+`
+
+func (q *Queries) ListLinks(ctx context.Context) ([]Golink, error) {
+	rows, err := q.db.QueryContext(ctx, listLinks)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var items []Golink
+	for rows.Next() {
+		var i Golink
+		if err := rows.Scan(
+			&i.ID,
+			&i.Name,
+			&i.Target,
+			&i.VisitCount,
+		); 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
+}

+ 1 - 0
dezendorf/applications/golink/internal/database/sqlc.json

@@ -0,0 +1 @@
+{"overrides":[],"packages":[{"emit_empty_slices":false,"emit_exact_table_names":false,"emit_interface":false,"emit_json_tags":false,"emit_prepared_queries":false,"engine":"mysql","name":"database","path":".","queries":["../../../../../../../../dezendorf/applications/golink/sql/query.sql"],"schema":["../../../../../../../../dezendorf/applications/golink/sql/schema.sql"]}],"version":"1"}

+ 16 - 0
dezendorf/applications/golink/sql/BUILD.bazel

@@ -0,0 +1,16 @@
+load("@com_plezentek_rules_sqlc//sqlc:def.bzl", "sqlc_package")
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+sqlc_package(
+    name = "golink_sql",
+    package = "database",
+    engine = "mysql",
+    queries = ["query.sql"],
+    schema = ["schema.sql"],
+)
+
+go_library(
+    name = "golink_sql_library",
+    srcs = [":golink_sql"],
+    importpath = "//dezendorf/applications/golink/sql",
+)

+ 2 - 0
dezendorf/applications/golink/sql/README.md

@@ -0,0 +1,2 @@
+bazel build //dezendorf/applications/golink/sql:golink_sql_library
+bazel build //dezendorf/applications/golink/sql:golink_sql

+ 39 - 0
dezendorf/applications/golink/sql/query.sql

@@ -0,0 +1,39 @@
+-- name: GetAuthor :one
+SELECT * FROM authors
+WHERE id = ? LIMIT 1;
+
+-- name: ListAuthors :many
+SELECT * FROM authors
+ORDER BY name;
+
+-- name: CreateAuthor :execresult
+INSERT INTO authors (
+  name
+) VALUES (
+  ?
+);
+
+-- name: DeleteAuthor :exec
+DELETE FROM authors
+WHERE id = ?;
+
+
+
+-- name: GetLink :one
+SELECT * FROM golinks
+WHERE name = ? LIMIT 1;
+
+-- name: ListLinks :many
+SELECT * FROM golinks
+ORDER BY name;
+
+-- name: CreateLink :execresult
+INSERT INTO golinks (
+  name, target
+) VALUES (
+  ?, ?
+);
+
+-- name: DeleteLink :exec
+DELETE FROM golinks
+WHERE id = ?;

+ 11 - 0
dezendorf/applications/golink/sql/schema.sql

@@ -0,0 +1,11 @@
+CREATE TABLE golinks (
+  id             BIGINT  NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  name           text    NOT NULL UNIQUE,
+  target         text    NOT NULL,
+  visit_count    BIGINT
+);
+
+CREATE TABLE authors (
+  id     BIGINT  NOT NULL AUTO_INCREMENT PRIMARY KEY,
+  name   text    NOT NULL UNIQUE
+);