Documentation
¶
Overview ¶
Package pgtalk provides functionality to create and execute type-safe Postgres Queries and Mutations using generated struct-per-table.
Index ¶
- Constants
- Variables
- func IndentedSQL(some SQLWriter) string
- func IsNotNull(e SQLExpression) nullCheck
- func IsNull(e SQLExpression) nullCheck
- func NewBooleanAccess(info ColumnInfo, writer fieldAccessFunc) booleanAccess
- func NewBytesAccess(info ColumnInfo, valueWriter func(dest any) *string) bytesAccess
- func NewFloat64Access(info ColumnInfo, writer fieldAccessFunc) float64Access
- func NewInt16Access(info ColumnInfo, valueWriter func(dest any) any) int16Access
- func NewInt32Access(info ColumnInfo, valueWriter func(dest any) any) int32Access
- func NewInt64Access(info ColumnInfo, valueWriter func(dest any) any) int64Access
- func NewJSONAccess(info ColumnInfo, valueWriter func(dest any) any) jsonAccess
- func NewTextAccess(info ColumnInfo, writer fieldAccessFunc) textAccess
- func NewTimeAccess(info ColumnInfo, valueWriter fieldAccessFunc) timeAccess
- func SQL(some SQLWriter) string
- func SQLAs(sql, name string) *computedField
- func StringWithFields(v any, includePresent bool) string
- type ColumnAccessor
- type ColumnAccessorSlice
- type ColumnInfo
- type FieldAccess
- func (FieldAccess) And(e SQLExpression) SQLExpression
- func (a FieldAccess[T]) AppendScannable(list []any) []any
- func (a FieldAccess[T]) Column() ColumnInfo
- func (a FieldAccess[T]) Compare(operator string, operand any) binaryExpression
- func (a FieldAccess[T]) Concat(resultName string, ex SQLExpression) ColumnAccessor
- func (a FieldAccess[T]) Equals(operand any) binaryExpression
- func (a FieldAccess[T]) FieldValueToScan(entity any) any
- func (a FieldAccess[T]) Get(values map[string]any) any
- func (a FieldAccess[T]) GreaterThan(operand any) binaryExpression
- func (a FieldAccess[T]) In(values ...T) SQLExpression
- func (a FieldAccess[T]) IsNotNull() binaryExpression
- func (a FieldAccess[T]) IsNull() binaryExpression
- func (a FieldAccess[T]) LessThan(operand any) binaryExpression
- func (FieldAccess) Or(e SQLExpression) SQLExpression
- func (a FieldAccess[T]) Set(v T) FieldAccess[T]
- func (a FieldAccess[T]) TableAlias(alias string) FieldAccess[T]
- func (a FieldAccess[T]) ValueToInsert() any
- type MutationSet
- func (m MutationSet[T]) Exec(ctx context.Context, conn querier, parameters ...*QueryParameter) ResultIterator[T]
- func (m MutationSet[T]) LogValue() slog.Value
- func (m MutationSet[T]) On() MutationSet[T]
- func (m MutationSet[T]) Returning(columns ...ColumnAccessor) MutationSet[T]
- func (m MutationSet[T]) SQLOn(w WriteContext)
- func (m MutationSet[T]) String() string
- func (m MutationSet[T]) Where(condition SQLExpression) MutationSet[T]
- type NullJSON
- type QueryCombineable
- type QueryParameter
- type QuerySet
- func (QuerySet) And(e SQLExpression) SQLExpression
- func (q QuerySet[T]) Ascending() QuerySet[T]
- func (q QuerySet[T]) Descending() QuerySet[T]
- func (q QuerySet[T]) Distinct() QuerySet[T]
- func (d QuerySet[T]) Except(o QueryCombineable, all ...bool) QueryCombineable
- func (d QuerySet[T]) Exec(ctx context.Context, conn querier, parameters ...*QueryParameter) (list []*T, err error)
- func (d QuerySet[T]) ExecIntoMaps(ctx context.Context, conn querier, parameters ...*QueryParameter) (list []map[string]any, err error)
- func (q QuerySet[T]) Exists() unaryExpression
- func (d QuerySet[T]) For(f SQL_FOR) QuerySet[T]
- func (d QuerySet[T]) FullJoin(otherQuerySet querySet) join
- func (q QuerySet[T]) GroupBy(cas ...ColumnAccessor) QuerySet[T]
- func (q QuerySet[T]) Having(condition SQLExpression) QuerySet[T]
- func (d QuerySet[T]) Intersect(o QueryCombineable, all ...bool) QueryCombineable
- func (d QuerySet[T]) Iterate(ctx context.Context, conn querier, parameters ...*QueryParameter) (*resultIterator[T], error)
- func (d QuerySet[T]) Join(otherQuerySet querySet) join
- func (d QuerySet[T]) LeftOuterJoin(otherQuerySet querySet) join
- func (q QuerySet[T]) Limit(limit int) QuerySet[T]
- func (d QuerySet[T]) LogValue() slog.Value
- func (q QuerySet[T]) Named(preparedName string) QuerySet[T]
- func (q QuerySet[T]) Offset(offset int) QuerySet[T]
- func (QuerySet) Or(e SQLExpression) SQLExpression
- func (q QuerySet[T]) OrderBy(cas ...SQLWriter) QuerySet[T]
- func (d QuerySet[T]) RightJoin(otherQuerySet querySet) joindeprecated
- func (d QuerySet[T]) RightOuterJoin(otherQuerySet querySet) join
- func (q QuerySet[T]) SQLOn(w WriteContext)
- func (d QuerySet[T]) SkipLocked() QuerySet[T]
- func (d QuerySet[T]) String() string
- func (q QuerySet[T]) TableAlias(alias string) QuerySet[T]
- func (d QuerySet[T]) Union(o QueryCombineable, all ...bool) QueryCombineable
- func (q QuerySet[T]) Where(condition SQLExpression) QuerySet[T]
- type ResultIterator
- type SQLExpression
- type SQLFunction
- type SQLLiteral
- type SQLWriter
- type SQL_FOR
- type TableInfo
- type WriteContext
Constants ¶
const ( IsPrimary = true NotPrimary = false NotNull = true Nullable = false )
const ( MutationDelete = iota MutationInsert MutationUpdate )
const HideNilValues = true
Variables ¶
var EmptyColumnAccessor = []ColumnAccessor{}
Functions ¶
func IndentedSQL ¶ added in v1.0.1
IndentedSQL returns source with tabs and lines trying to have a formatted view.
func IsNotNull ¶
func IsNotNull(e SQLExpression) nullCheck
IsNotNull returns an expression with the IS NOT NULL condition
func IsNull ¶
func IsNull(e SQLExpression) nullCheck
IsNull returns an expression with the IS NULL condition
func NewBooleanAccess ¶
func NewBooleanAccess(info ColumnInfo, writer fieldAccessFunc) booleanAccess
func NewBytesAccess ¶
func NewBytesAccess(info ColumnInfo, valueWriter func(dest any) *string) bytesAccess
func NewFloat64Access ¶
func NewFloat64Access(info ColumnInfo, writer fieldAccessFunc) float64Access
func NewInt16Access ¶ added in v1.14.0
func NewInt16Access( info ColumnInfo, valueWriter func(dest any) any) int16Access
func NewInt32Access ¶ added in v0.29.2
func NewInt32Access( info ColumnInfo, valueWriter func(dest any) any) int32Access
func NewInt64Access ¶
func NewInt64Access( info ColumnInfo, valueWriter func(dest any) any) int64Access
func NewJSONAccess ¶ added in v1.0.0
func NewJSONAccess(info ColumnInfo, valueWriter func(dest any) any) jsonAccess
func NewTextAccess ¶
func NewTextAccess(info ColumnInfo, writer fieldAccessFunc) textAccess
func NewTimeAccess ¶
func NewTimeAccess(info ColumnInfo, valueWriter fieldAccessFunc) timeAccess
func SQLAs ¶ added in v0.23.1
func SQLAs(sql, name string) *computedField
SQLAs returns a ColumnAccessor with a customer SQL expression.
The named result will be available using the GetExpressionResult method of the record type.
func StringWithFields ¶
Types ¶
type ColumnAccessor ¶
type ColumnAccessor interface {
SQLWriter
Name() string
ValueToInsert() any
Column() ColumnInfo
// FieldValueToScan returns the address of the value of the field in the entity
FieldValueToScan(entity any) any
// AppendScannable collects values for scanning by a result Row
// Cannot use ValueToInsert because that looses type information such that the Scanner will use default mapping
AppendScannable(list []any) []any
// Get accesses the value from a map.
// (unfortunately, Go methods cannot have additional type parameters:
// Get[V](values map[string]any) V )
Get(values map[string]any) any
// Returns the SQL expression to set the value in a mutation, defaults to $1 format
SetSource(parameterIndex int) string
}
func NewTSVector ¶ added in v1.10.0
func NewTSVector(columnInfo ColumnInfo, value string) ColumnAccessor
NewTSVector returns a ColumnAccessor for writing the value of tsvector typed column. Cannot be used for reading the value of such a column.
func NewTSVectorWithConfig ¶ added in v1.10.0
func NewTSVectorWithConfig(columnInfo ColumnInfo, regconfig, value string) ColumnAccessor
NewTSVectorWithConfig returns a ColumnAccessor for writing the value of tsvector typed column. Cannot be used for reading the value of such a column.
type ColumnAccessorSlice ¶ added in v1.8.1
type ColumnAccessorSlice []ColumnAccessor
ColumnAccessorSlice is a slice of ColumnAccessor
func NewColumns ¶ added in v1.8.1
func NewColumns(cas ...ColumnAccessor) (list ColumnAccessorSlice)
Returns a ColumnAccessorSlice which can be initialized with a list of ColumnAccessor. This can be used to conditionally build a list of columns e.g when updating.
func (*ColumnAccessorSlice) Add ¶ added in v1.8.1
func (s *ColumnAccessorSlice) Add(c ColumnAccessor)
Add appends a non-nil column accessor to the list
type ColumnInfo ¶
type ColumnInfo struct {
// contains filtered or unexported fields
}
func MakeColumnInfo ¶
func MakeColumnInfo(tableInfo TableInfo, columnName string, isPrimary bool, isNotNull bool, _ uint16) ColumnInfo
MakeColumnInfo creates a ColumnInfo describing a column in a table. The last argument is now ignored (used to be table attribute number, field ordinal).
func (ColumnInfo) Name ¶
func (c ColumnInfo) Name() string
func (ColumnInfo) SQLOn ¶
func (c ColumnInfo) SQLOn(w WriteContext)
func (ColumnInfo) SetSource ¶ added in v1.10.0
func (c ColumnInfo) SetSource(parameterIndex int) string
func (ColumnInfo) TableAlias ¶ added in v0.14.0
func (c ColumnInfo) TableAlias(alias string) ColumnInfo
TableAlias changes the table alias for this column info.
type FieldAccess ¶
type FieldAccess[T any] struct { ColumnInfo // contains filtered or unexported fields }
func NewFieldAccess ¶
func NewFieldAccess[T any]( info ColumnInfo, writer func(dest any) any) FieldAccess[T]
func (FieldAccess) And ¶ added in v0.21.0
func (FieldAccess) And(e SQLExpression) SQLExpression
func (FieldAccess[T]) AppendScannable ¶ added in v0.16.0
func (a FieldAccess[T]) AppendScannable(list []any) []any
AppendScannable is part of ColumnAccessor
func (FieldAccess[T]) Column ¶
func (a FieldAccess[T]) Column() ColumnInfo
func (FieldAccess[T]) Compare ¶ added in v0.14.0
func (a FieldAccess[T]) Compare(operator string, operand any) binaryExpression
func (FieldAccess[T]) Concat ¶ added in v0.15.0
func (a FieldAccess[T]) Concat(resultName string, ex SQLExpression) ColumnAccessor
func (FieldAccess[T]) Equals ¶
func (a FieldAccess[T]) Equals(operand any) binaryExpression
Equals returns a SQLExpression
func (FieldAccess[T]) FieldValueToScan ¶ added in v0.15.2
func (a FieldAccess[T]) FieldValueToScan(entity any) any
func (FieldAccess[T]) Get ¶ added in v0.16.0
func (a FieldAccess[T]) Get(values map[string]any) any
Get returns the value for its columnName from a map (row).
func (FieldAccess[T]) GreaterThan ¶ added in v1.3.0
func (a FieldAccess[T]) GreaterThan(operand any) binaryExpression
GreaterThan returns a SQLExpression
func (FieldAccess[T]) In ¶ added in v0.14.0
func (a FieldAccess[T]) In(values ...T) SQLExpression
In returns a binary expression to check that the value of the fieldAccess is in the values collection.
func (FieldAccess[T]) IsNotNull ¶ added in v1.0.0
func (a FieldAccess[T]) IsNotNull() binaryExpression
IsNotNull creates a SQL Expresion with IS NOT NULL.
func (FieldAccess[T]) IsNull ¶ added in v1.0.0
func (a FieldAccess[T]) IsNull() binaryExpression
IsNull creates a SQL Expresion with IS NULL.
func (FieldAccess[T]) LessThan ¶
func (a FieldAccess[T]) LessThan(operand any) binaryExpression
LessThan returns a SQLExpression
func (FieldAccess) Or ¶ added in v0.21.0
func (FieldAccess) Or(e SQLExpression) SQLExpression
func (FieldAccess[T]) Set ¶
func (a FieldAccess[T]) Set(v T) FieldAccess[T]
Set returns a new FieldAccess[T] with a value to set on a T.
func (FieldAccess[T]) TableAlias ¶ added in v0.14.0
func (a FieldAccess[T]) TableAlias(alias string) FieldAccess[T]
TableAlias changes the table alias for this column accessor.
func (FieldAccess[T]) ValueToInsert ¶
func (a FieldAccess[T]) ValueToInsert() any
type MutationSet ¶
type MutationSet[T any] struct { // contains filtered or unexported fields }
func MakeMutationSet ¶
func MakeMutationSet[T any](tableInfo TableInfo, selectors []ColumnAccessor, operationType int) MutationSet[T]
func (MutationSet[T]) Exec ¶
func (m MutationSet[T]) Exec(ctx context.Context, conn querier, parameters ...*QueryParameter) ResultIterator[T]
Pre: must be run inside transaction. The iterator is closed unless it has data to return (set via Returning). The iterator must be closed on error or after consuming all data.
func (MutationSet[T]) LogValue ¶ added in v1.14.1
func (m MutationSet[T]) LogValue() slog.Value
LogValue implements the LogValuer interface for MutationSet. It is used for slog.
func (MutationSet[T]) Returning ¶
func (m MutationSet[T]) Returning(columns ...ColumnAccessor) MutationSet[T]
func (MutationSet[T]) SQLOn ¶
func (m MutationSet[T]) SQLOn(w WriteContext)
SQLOn returns the full SQL mutation query
func (MutationSet[T]) String ¶ added in v1.12.2
func (m MutationSet[T]) String() string
String implements the Stringer interface for MutationSet. It is used for logging.
func (MutationSet[T]) Where ¶
func (m MutationSet[T]) Where(condition SQLExpression) MutationSet[T]
type NullJSON ¶ added in v1.0.0
NullJSON is a value that can scan a Nullable value to an empty interface (any)
type QueryCombineable ¶ added in v1.11.0
type QueryCombineable interface {
fmt.Stringer
SQLWriter
// Every SELECT statement within UNION must have the same number of columns
// The columns must also have similar data types
// The columns in every SELECT statement must also be in the same order
Union(o QueryCombineable, all ...bool) QueryCombineable
// There are some mandatory rules for INTERSECT operations such as the
// number of columns, data types, and other columns must be the same
// in both SELECT statements for the INTERSECT operator to work correctly.
Intersect(o QueryCombineable, all ...bool) QueryCombineable
// There are some mandatory rules for EXCEPT operations such as the
// number of columns, data types, and other columns must be the same
// in both EXCEPT statements for the EXCEPT operator to work correctly.
Except(o QueryCombineable, all ...bool) QueryCombineable
// ExecIntoMaps executes the query and returns each rows as a map string->any .
// To include table information for each, append a custom sqlfunction to each select statement.
// For example, adding `pgtalk.SQLAs("'products'", "table")` will add an entry to the map.
ExecIntoMaps(ctx context.Context, conn querier, parameters ...*QueryParameter) (list []map[string]any, err error)
}
type QueryParameter ¶ added in v0.23.0
type QueryParameter struct {
// contains filtered or unexported fields
}
QueryParameter captures any value as a parameter to use in a SQL query or mutation.
func NewParameter ¶ added in v0.23.0
func NewParameter(value any) *QueryParameter
TODO can we use type parameterization here? func NewParameter[T any](value T) *QueryParameter[T] { return &QueryParameter{value: value} }
func (QueryParameter) And ¶ added in v0.23.0
func (QueryParameter) And(e SQLExpression) SQLExpression
func (QueryParameter) Or ¶ added in v0.23.0
func (QueryParameter) Or(e SQLExpression) SQLExpression
func (QueryParameter) SQLOn ¶ added in v0.23.0
func (a QueryParameter) SQLOn(w WriteContext)
SQLOn is part of SQLWriter
type QuerySet ¶
type QuerySet[T any] struct { // contains filtered or unexported fields }
func MakeQuerySet ¶
func MakeQuerySet[T any](tableInfo TableInfo, selectors []ColumnAccessor) QuerySet[T]
func (QuerySet) And ¶ added in v0.21.0
func (QuerySet) And(e SQLExpression) SQLExpression
func (QuerySet[T]) Descending ¶
Descending is a SQL instruction for DESC sort option
func (QuerySet[T]) Except ¶ added in v1.11.0
func (d QuerySet[T]) Except(o QueryCombineable, all ...bool) QueryCombineable
There are some mandatory rules for EXCEPT operations such as the number of columns, data types, and other columns must be the same in both EXCEPT statements for the EXCEPT operator to work correctly.
func (QuerySet[T]) Exec ¶
func (d QuerySet[T]) Exec(ctx context.Context, conn querier, parameters ...*QueryParameter) (list []*T, err error)
func (QuerySet[T]) ExecIntoMaps ¶ added in v0.15.2
func (d QuerySet[T]) ExecIntoMaps(ctx context.Context, conn querier, parameters ...*QueryParameter) (list []map[string]any, err error)
ExecIntoMaps executes the query and returns a list of generic maps (column->value). This can be used if you do not want to get full records types or have multiple custom values.
func (QuerySet[T]) GroupBy ¶
func (q QuerySet[T]) GroupBy(cas ...ColumnAccessor) QuerySet[T]
GroupBy is a SQL instruction
func (QuerySet[T]) Having ¶
func (q QuerySet[T]) Having(condition SQLExpression) QuerySet[T]
func (QuerySet[T]) Intersect ¶ added in v1.11.0
func (d QuerySet[T]) Intersect(o QueryCombineable, all ...bool) QueryCombineable
There are some mandatory rules for INTERSECT operations such as the number of columns, data types, and other columns must be the same in both INTERSECT statements for the INTERSECT operator to work correctly.
func (QuerySet[T]) Iterate ¶
func (d QuerySet[T]) Iterate(ctx context.Context, conn querier, parameters ...*QueryParameter) (*resultIterator[T], error)
func (QuerySet[T]) LeftOuterJoin ¶
func (d QuerySet[T]) LeftOuterJoin(otherQuerySet querySet) join
func (QuerySet[T]) LogValue ¶ added in v1.14.1
LogValue implements the LogValuer interface for MutationSet. It is used for slog.
func (QuerySet) Or ¶ added in v0.21.0
func (QuerySet) Or(e SQLExpression) SQLExpression
func (QuerySet[T]) RightOuterJoin ¶ added in v1.4.2
func (d QuerySet[T]) RightOuterJoin(otherQuerySet querySet) join
func (QuerySet[T]) SQLOn ¶
func (q QuerySet[T]) SQLOn(w WriteContext)
func (QuerySet[T]) SkipLocked ¶ added in v1.5.0
func (QuerySet[T]) String ¶ added in v1.12.2
String implements the Stringer interface for QuerySet. It is used for logging.
func (QuerySet[T]) TableAlias ¶ added in v0.14.0
TableAlias will override the default table or view alias
func (QuerySet[T]) Union ¶ added in v1.11.0
func (d QuerySet[T]) Union(o QueryCombineable, all ...bool) QueryCombineable
There are some mandatory rules for UNION operations such as the number of columns, data types, and other columns must be the same in both UNION statements for the UNION operator to work correctly.
func (QuerySet[T]) Where ¶
func (q QuerySet[T]) Where(condition SQLExpression) QuerySet[T]
Where is a SQL instruction
type ResultIterator ¶
type ResultIterator[T any] interface { // Close closes the rows of the iterator, making the connection ready for use again. It is safe // to call Close after rows is already closed. // Close is called implicitly when no return results are expected. Close() // Err returns the Query error if any Err() error // HasNext returns true if a more results are available. If not then Close is called implicitly. HasNext() bool // Next returns the next row populated in a T. Next() (*T, error) // GetParams returns all the parameters used in the query. Can be used for debugging or logging GetParams() map[int]any // CommandTag is valid if the query is an Exec query, i.e. not returning rows. CommandTag() pgconn.CommandTag }
ResultIterator is returned from executing a Query (or Mutation).
type SQLExpression ¶
type SQLExpression interface {
SQLWriter
And(expr SQLExpression) SQLExpression
Or(expr SQLExpression) SQLExpression
}
var EmptyCondition SQLExpression = noCondition{}
func NewSQLConstant ¶ added in v1.2.0
func NewSQLConstant(value any) SQLExpression
func NewTSQuery ¶ added in v1.10.0
func NewTSQuery(columnInfo ColumnInfo, query string) SQLExpression
NewTSQuery returns a condition SQL Expression to match @@ a search query with a search vector (column).
func NewTSQueryWithConfig ¶ added in v1.11.1
func NewTSQueryWithConfig(columnInfo ColumnInfo, regconfig, query string) SQLExpression
NewTSQuery returns a condition SQL Expression to match @@ a search query with a search vector (column) and a config.
type SQLFunction ¶ added in v0.24.0
type SQLFunction struct {
Name string
Arguments []SQLExpression
}
SQLFunction is for calling any Postgres standard function with zero or more arguments as part of your query. Typically used together with pgtalk.SQLAs.
func NewSQLFunction ¶ added in v0.24.0
func NewSQLFunction(name string, arguments ...SQLExpression) SQLFunction
NewSQLFunction creates a new SQLFunction value.
func (SQLFunction) SQLOn ¶ added in v0.24.0
func (f SQLFunction) SQLOn(w WriteContext)
SQLOn is part of SQLWriter
type SQLLiteral ¶ added in v1.0.0
type SQLLiteral struct {
Literal string
}
func (SQLLiteral) SQLOn ¶ added in v1.0.0
func (l SQLLiteral) SQLOn(w WriteContext)
type SQLWriter ¶
type SQLWriter interface {
// SQLOn writes a valid SQL on a Writer in a context
SQLOn(w WriteContext)
}
type TableInfo ¶
type TableInfo struct {
Name string
Schema string // e.g. public
Alias string
// Columns are all known columns for this table ;initialized by the generated package
Columns []ColumnAccessor
}
TableInfo describes a table in the database.
type WriteContext ¶ added in v0.14.0
type WriteContext interface {
Write(p []byte) (n int, err error)
WithAlias(tableName, alias string) WriteContext
TableAlias(tableName, defaultAlias string) string
}
func NewWriteContext ¶ added in v0.14.0
func NewWriteContext(w io.Writer) WriteContext
NewWriteContext returns a new WriteContext to produce SQL
Source Files
¶
- access.go
- access_bool.go
- access_bytes.go
- access_float.go
- access_int16.go
- access_int32.go
- access_int64.go
- access_json.go
- access_text.go
- access_time.go
- assertions.go
- column_info.go
- combining.go
- computed_field.go
- doc.go
- fieldaccess.go
- function.go
- interfaces.go
- iterator.go
- join.go
- mutationset.go
- nulljson.go
- operators.go
- query_parameter.go
- queryset.go
- sql_writing.go
- table_info.go
- tsvector.go