sqlp

package module
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 1, 2024 License: MIT Imports: 8 Imported by: 0

README

sql+

Go Reference

sql+ provides some convenience functions for using structs with go's database/sql package

it is fully based on kisielks package. I am using it for experimenting with orm-concepts and am using it for some private projects. Simple stuff, no external dependencies.

Stuff changes and breaks fast atm. Testing is limited.

Changes made in this fork

  1. Use generics instead of interface{}: In my opinion, using generics improves readability and allows for additional functionality.
  2. Keep Language Injections intact: Intellij IDEs offer language injections that, in this case, provide support for sql-queries if literals match sql query patterns. This was previously not possible, because for injecting columns dynamically with sqlp, a pattern like fmt.Sprintf("SELECT %s FROM ...", sqlstruct.Columns(mystruct{})) had to be used.
  3. Improved the package for my use-cases: While I would love for someone else to find use in this package, one of its main goals is to allow for the removal of boilerplate and redundant code in my private project by integrating patterns I often deploy. For example, some limited support for IN(*)-Select queries and INSERTs were added.

Usage

This package allows linking a struct and its database-counterpart, which means that SELECT-queries automatically reflect changes made to the datastructure by injecting the required columns into the query.

This works by extracting the exported fields of a struct, converting their names and inserting them into the given query. Just write the queries as normal using the autocomplete language injections provide and let your struct-definitions and sqlp take care of the columns.

Documentation

Overview

Package sqlp provides some convenience functions for using structs with the Go standard library's database/sql package.

The package matches struct field names to SQL query column names. A field can also specify a matching column with "sql" tag, if it's different from field name. Unexported fields or fields marked with `sql:"-"` are ignored, just like with "encoding/json" package.

For example: ToDo (See Readme)

Index

Constants

This section is empty.

Variables

View Source
var (
	// NameMapper is the function used to convert struct fields which do not have sql tags
	// into database column names.
	//
	// The default mapper converts field names to lower case. If instead you would prefer
	// field names converted to snake case, simply assign sqlp.ToSnakeCase to the variable:
	//
	//	sqlp.NameMapper = sqlp.ToSnakeCase
	//
	// Alternatively for a custom mapping, any func(string) string can be used instead.
	NameMapper = strings.ToLower

	// TagName is the name of the tag to use on struct fields
	TagName        = "sql"
	AutoGenTagName = "sql-auto"

	QueryReplace   = "*"
	InQueryReplace = "(*)"

	ErrNotSet = errors.New("sqlp: database not set")
)

Functions

func Columns

func Columns[T any]() string

Columns returns a string containing a sorted, comma-separated list of column names as defined by the type s. s must be a struct that has exported fields tagged with the "sql" tag.

func Insert

func Insert[T any](obj T, table string) (int64, error)

Insert inserts the given object into the table and returns the last inserted id. Autogenerated fields can be tagged with `sql-auto:""` (AutoGenTagName) in order for them to be ignored during insert.

func Query

func Query[T any](query string, args ...any) (slice []T, err error)

Query executes the given query using the global database handle and returns the resulting objects in a slice. SetDatabase must be called before using this function. The query should use the QueryReplace (* by default) string to indicate where the columns from the struct type T should be inserted.

For example for the following struct:

type User struct {
	ID   int
	Name string
}

and the following query

SELECT * FROM users WHERE id = ?

the query sent to the database will be

SELECT id, name FROM users WHERE id = ?

and a list of User objects will be returned.

In addition, "IN"-queries are supported. If the query contains the InQueryReplace string, the function will automatically replace it with the correct amount of "?". For example, if you give the following query

SELECT * FROM users WHERE id IN (*)

and the following arguments

Query("SELECT * FROM users WHERE id IN (*) AND name LIKE '%?'", []int{1, 2, 3}, "a")

func QueryBasic

func QueryBasic[T string | int | int64 | float32 | float64](query string, args ...any) (results []T, err error)

QueryBasic is Query, but for basic data types.

func QueryRow

func QueryRow[T any](query string, args ...any) (stru T, err error)

QueryRow works similar to Query except it returns only the first row from the result set. SetDatabase must be called before using this function. Check the Query function for more information.

func Scan

func Scan[T any](dest *T, rows Rows) error

Scan scans the next row from rows in to a struct pointed to by dest. The struct type should have exported fields tagged with the "sql" tag. Columns from row which are not mapped to any struct fields are ignored. Struct fields which have no matching column in the result set are left unchanged.

func SetDatabase

func SetDatabase(sqldb *sql.DB)

SetDatabase sets the global database handle to be used by the Query function.

func ToSnakeCase

func ToSnakeCase(src string) string

ToSnakeCase converts a string to snake case, words separated with underscores. It's intended to be used with NameMapper to map struct field names to snake case database fields.

func Update

func Update[T any](obj T, table string) error

Types

type Rows

type Rows interface {
	Scan(...any) error
	Columns() ([]string, error)
}

Rows defines the interface of types that are scannable with the Scan function. It is implemented by the sql.Rows type from the standard library

type Scanner

type Scanner interface {
	Scan(src any) error
}

Scanner is an interface used by Scan.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL