Documentation ¶
Overview ¶
Package gocqlx makes working with Scylla easy and error prone without sacrificing performance. It’s inspired by Sqlx, a tool for working with SQL databases, but it goes beyond what Sqlx provides.
For more details consult README.
Index ¶
- Variables
- func CompileNamedQuery(qs []byte) (stmt string, names []string, err error)
- func CompileNamedQueryString(qs string) (stmt string, names []string, err error)
- type Iterx
- func (iter *Iterx) Close() error
- func (iter *Iterx) Get(dest interface{}) error
- func (iter *Iterx) Scan(dest ...interface{}) bool
- func (iter *Iterx) Select(dest interface{}) error
- func (iter *Iterx) StructOnly() *Iterx
- func (iter *Iterx) StructScan(dest interface{}) bool
- func (iter *Iterx) Unsafe() *Iterx
- type Queryx
- func (q *Queryx) Bind(v ...interface{}) *Queryx
- func (q *Queryx) BindMap(arg map[string]interface{}) *Queryx
- func (q *Queryx) BindStruct(arg interface{}) *Queryx
- func (q *Queryx) BindStructMap(arg0 interface{}, arg1 map[string]interface{}) *Queryx
- func (q *Queryx) Consistency(c gocql.Consistency) *Queryx
- func (q *Queryx) CustomPayload(customPayload map[string][]byte) *Queryx
- func (q *Queryx) DefaultTimestamp(enable bool) *Queryx
- func (q *Queryx) Err() error
- func (q *Queryx) Exec() error
- func (q *Queryx) ExecCAS() (applied bool, err error)
- func (q *Queryx) ExecCASRelease() (bool, error)
- func (q *Queryx) ExecRelease() error
- func (q *Queryx) Get(dest interface{}) error
- func (q *Queryx) GetCAS(dest interface{}) (applied bool, err error)
- func (q *Queryx) GetCASRelease(dest interface{}) (bool, error)
- func (q *Queryx) GetRelease(dest interface{}) error
- func (q *Queryx) Idempotent(value bool) *Queryx
- func (q *Queryx) Iter() *Iterx
- func (q *Queryx) NoSkipMetadata() *Queryx
- func (q *Queryx) Observer(observer gocql.QueryObserver) *Queryx
- func (q *Queryx) PageSize(n int) *Queryx
- func (q *Queryx) PageState(state []byte) *Queryx
- func (q *Queryx) Prefetch(p float64) *Queryx
- func (q *Queryx) RetryPolicy(r gocql.RetryPolicy) *Queryx
- func (q *Queryx) RoutingKey(routingKey []byte) *Queryx
- func (q *Queryx) Select(dest interface{}) error
- func (q *Queryx) SelectRelease(dest interface{}) error
- func (q *Queryx) SerialConsistency(cons gocql.SerialConsistency) *Queryx
- func (q *Queryx) SetSpeculativeExecutionPolicy(sp gocql.SpeculativeExecutionPolicy) *Queryx
- func (q *Queryx) Trace(trace gocql.Tracer) *Queryx
- func (q *Queryx) WithBindTransformer(tr Transformer) *Queryx
- func (q *Queryx) WithContext(ctx context.Context) *Queryx
- func (q *Queryx) WithTimestamp(timestamp int64) *Queryx
- type Session
- type Transformer
- type UDT
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var DefaultMapper = reflectx.NewMapperFunc("db", reflectx.CamelToSnakeASCII)
DefaultMapper uses `db` tag and automatically converts struct field names to snake case. It can be set to whatever you want, but it is encouraged to be set before gocqlx is used as name-to-field mappings are cached after first use on a type.
A custom mapper can always be set per Sessionm, Query and Iter.
var DefaultUnsafe bool
DefaultUnsafe enables the behavior of forcing the iterator to ignore missing fields for all queries. See Unsafe below for more information.
var UnsetEmptyTransformer = func(name string, val interface{}) interface{} { v := reflect.ValueOf(val) if v.IsZero() { return gocql.UnsetValue } return val }
UnsetEmptyTransformer unsets all empty parameters. It helps to avoid tombstones when using the same insert/update statement for filled and partially filled named parameters.
Functions ¶
func CompileNamedQuery ¶
CompileNamedQuery translates query with named parameters in a form ':<identifier>' to query with '?' placeholders and a list of parameter names. If you need to use ':' in a query, i.e. with maps or UDTs use '::' instead.
func CompileNamedQueryString ¶
CompileNamedQueryString translates query with named parameters in a form ':<identifier>' to query with '?' placeholders and a list of parameter names. If you need to use ':' in a query, i.e. with maps or UDTs use '::' instead.
Types ¶
type Iterx ¶
Iterx is a wrapper around gocql.Iter which adds struct scanning capabilities.
func (*Iterx) Close ¶
Close closes the iterator and returns any errors that happened during the query or the iteration.
func (*Iterx) Get ¶
Get scans first row into a destination and closes the iterator.
If the destination type is a struct pointer, then StructScan will be used. If the destination is some other type, then the row must only have one column which can scan into that type. This includes types that implement gocql.Unmarshaler and gocql.UDTUnmarshaler.
If you'd like to treat a type that implements gocql.Unmarshaler or gocql.UDTUnmarshaler as an ordinary struct you should call StructOnly().Get(dest) instead.
If no rows were selected, ErrNotFound is returned.
func (*Iterx) Scan ¶
Scan consumes the next row of the iterator and copies the columns of the current row into the values pointed at by dest. Use nil as a dest value to skip the corresponding column. Scan might send additional queries to the database to retrieve the next set of rows if paging was enabled.
Scan returns true if the row was successfully unmarshaled or false if the end of the result set was reached or if an error occurred. Close should be called afterwards to retrieve any potential errors.
func (*Iterx) Select ¶
Select scans all rows into a destination, which must be a pointer to slice of any type, and closes the iterator.
If the destination slice type is a struct, then StructScan will be used on each row. If the destination is some other type, then each row must only have one column which can scan into that type. This includes types that implement gocql.Unmarshaler and gocql.UDTUnmarshaler.
If you'd like to treat a type that implements gocql.Unmarshaler or gocql.UDTUnmarshaler as an ordinary struct you should call StructOnly().Select(dest) instead.
If no rows were selected, ErrNotFound is NOT returned.
func (*Iterx) StructOnly ¶
StructOnly forces the iterator to treat a single-argument struct as non-scannable. This is is useful if you need to scan a row into a struct that also implements gocql.UDTUnmarshaler or in rare cases gocql.Unmarshaler.
func (*Iterx) StructScan ¶
StructScan is like gocql.Iter.Scan, but scans a single row into a single struct. Use this and iterate manually when the memory load of Select() might be prohibitive. StructScan caches the reflect work of matching up column positions to fields to avoid that overhead per scan, which means it is not safe to run StructScan on the same Iterx instance with different struct types.
type Queryx ¶
type Queryx struct { *gocql.Query Names []string Mapper *reflectx.Mapper // contains filtered or unexported fields }
Queryx is a wrapper around gocql.Query which adds struct binding capabilities.
func (*Queryx) Bind ¶
Bind sets query arguments of query. This can also be used to rebind new query arguments to an existing query instance.
func (*Queryx) BindStruct ¶
BindStruct binds query named parameters to values from arg using mapper. If value cannot be found error is reported.
func (*Queryx) BindStructMap ¶
BindStructMap binds query named parameters to values from arg0 and arg1 using a mapper. If value cannot be found in arg0 it's looked up in arg1 before reporting an error.
func (*Queryx) Consistency ¶
func (q *Queryx) Consistency(c gocql.Consistency) *Queryx
Consistency sets the consistency level for this query. If no consistency level have been set, the default consistency level of the cluster is used.
func (*Queryx) CustomPayload ¶
CustomPayload sets the custom payload level for this query.
func (*Queryx) DefaultTimestamp ¶
DefaultTimestamp will enable the with default timestamp flag on the query. If enable, this will replace the server side assigned timestamp as default timestamp. Note that a timestamp in the query itself will still override this timestamp. This is entirely optional.
Only available on protocol >= 3
func (*Queryx) ExecCAS ¶
ExecCAS executes the Lightweight Transaction query, returns whether query was applied. See: https://docs.scylladb.com/using-scylla/lwt/ for more details.
When using Cassandra it may be necessary to use NoSkipMetadata in order to obtain an accurate "applied" value. See the documentation of NoSkipMetaData method on this page for more details.
func (*Queryx) ExecCASRelease ¶
ExecCASRelease calls ExecCAS and releases the query, a released query cannot be reused.
func (*Queryx) ExecRelease ¶
ExecRelease calls Exec and releases the query, a released query cannot be reused.
func (*Queryx) Get ¶
Get scans first row into a destination and closes the iterator.
If the destination type is a struct pointer, then Iter.StructScan will be used. If the destination is some other type, then the row must only have one column which can scan into that type. This includes types that implement gocql.Unmarshaler and gocql.UDTUnmarshaler.
If you'd like to treat a type that implements gocql.Unmarshaler or gocql.UDTUnmarshaler as an ordinary struct you should call Iter().StructOnly().Get(dest) instead.
If no rows were selected, ErrNotFound is returned.
func (*Queryx) GetCAS ¶
GetCAS executes a lightweight transaction. If the transaction fails because the existing values did not match, the previous values will be stored in dest object. See: https://docs.scylladb.com/using-scylla/lwt/ for more details.
func (*Queryx) GetCASRelease ¶
GetCASRelease calls GetCAS and releases the query, a released query cannot be reused.
func (*Queryx) GetRelease ¶
GetRelease calls Get and releases the query, a released query cannot be reused.
func (*Queryx) Idempotent ¶
Idempotent marks the query as being idempotent or not depending on the value.
func (*Queryx) Iter ¶
Iter returns Iterx instance for the query. It should be used when data is too big to be loaded with Select in order to do row by row iteration. See Iterx StructScan function.
func (*Queryx) NoSkipMetadata ¶
NoSkipMetadata will override the internal result metadata cache so that the driver does not send skip_metadata for queries, this means that the result will always contain the metadata to parse the rows and will not reuse the metadata from the prepared staement. This should only be used to work around cassandra bugs, such as when using CAS operations which do not end in Cas.
See https://issues.apache.org/jira/browse/CASSANDRA-11099 https://github.com/gocql/gocql/issues/612
func (*Queryx) Observer ¶
func (q *Queryx) Observer(observer gocql.QueryObserver) *Queryx
Observer enables query-level observer on this query. The provided observer will be called every time this query is executed.
func (*Queryx) PageSize ¶
PageSize will tell the iterator to fetch the result in pages of size n. This is useful for iterating over large result sets, but setting the page size too low might decrease the performance. This feature is only available in Cassandra 2 and onwards.
func (*Queryx) PageState ¶
PageState sets the paging state for the query to resume paging from a specific point in time. Setting this will disable to query paging for this query, and must be used for all subsequent pages.
func (*Queryx) Prefetch ¶
Prefetch sets the default threshold for pre-fetching new pages. If there are only p*pageSize rows remaining, the next page will be requested automatically.
func (*Queryx) RetryPolicy ¶
func (q *Queryx) RetryPolicy(r gocql.RetryPolicy) *Queryx
RetryPolicy sets the policy to use when retrying the query.
func (*Queryx) RoutingKey ¶
RoutingKey sets the routing key to use when a token aware connection pool is used to optimize the routing of this query.
func (*Queryx) Select ¶
Select scans all rows into a destination, which must be a pointer to slice of any type, and closes the iterator.
If the destination slice type is a struct, then Iter.StructScan will be used on each row. If the destination is some other type, then each row must only have one column which can scan into that type. This includes types that implement gocql.Unmarshaler and gocql.UDTUnmarshaler.
If you'd like to treat a type that implements gocql.Unmarshaler or gocql.UDTUnmarshaler as an ordinary struct you should call Iter().StructOnly().Select(dest) instead.
If no rows were selected, ErrNotFound is NOT returned.
func (*Queryx) SelectRelease ¶
SelectRelease calls Select and releases the query, a released query cannot be reused.
func (*Queryx) SerialConsistency ¶
func (q *Queryx) SerialConsistency(cons gocql.SerialConsistency) *Queryx
SerialConsistency sets the consistency level for the serial phase of conditional updates. That consistency can only be either SERIAL or LOCAL_SERIAL and if not present, it defaults to SERIAL. This option will be ignored for anything else that a conditional update/insert.
func (*Queryx) SetSpeculativeExecutionPolicy ¶
func (q *Queryx) SetSpeculativeExecutionPolicy(sp gocql.SpeculativeExecutionPolicy) *Queryx
SetSpeculativeExecutionPolicy sets the execution policy.
func (*Queryx) Trace ¶
Trace enables tracing of this query. Look at the documentation of the Tracer interface to learn more about tracing.
func (*Queryx) WithBindTransformer ¶ added in v2.6.0
func (q *Queryx) WithBindTransformer(tr Transformer) *Queryx
WithBindTransformer sets the query bind transformer. The transformer is called right before binding a value to a named parameter.
func (*Queryx) WithContext ¶
WithContext returns a shallow copy of q with its context set to ctx.
The provided context controls the entire lifetime of executing a query, queries will be canceled and return once the context is canceled.
func (*Queryx) WithTimestamp ¶
WithTimestamp will enable the with default timestamp flag on the query like DefaultTimestamp does. But also allows to define value for timestamp. It works the same way as USING TIMESTAMP in the query itself, but should not break prepared query optimization
Only available on protocol >= 3
type Session ¶
Session wraps gocql.Session and provides a modified Query function that returns Queryx instance. The original Session instance can be accessed as Session. The default mapper uses `db` tag and automatically converts struct field names to snake case. If needed package reflectx provides constructors for other types of mappers.
Example ¶
cluster := gocql.NewCluster("host") session, err := gocqlx.WrapSession(cluster.CreateSession()) if err != nil { // handle error } builder := qb.Select("foo") session.Query(builder.ToCql())
Output:
func NewSession ¶ added in v2.0.3
NewSession wraps existing gocql.session.
func WrapSession ¶
WrapSession should be called on CreateSession() gocql function to convert the created session to gocqlx.Session.
Example:
session, err := gocqlx.WrapSession(cluster.CreateSession())
func (Session) ContextQuery ¶
ContextQuery is a helper function that allows to pass context when creating a query, see the "Query" function .
func (Session) Query ¶
Query creates a new Queryx using the session mapper. The stmt and names parameters are typically result of a query builder (package qb) ToCql() function or come from table model (package table). The names parameter is a list of query parameters' names and it's used for binding.
type Transformer ¶ added in v2.6.0
type Transformer func(name string, val interface{}) interface{}
Transformer transforms the value of the named parameter to another value.
var DefaultBindTransformer Transformer
DefaultBindTransformer just do nothing.
A custom transformer can always be set per Query.
type UDT ¶
type UDT interface {
// contains filtered or unexported methods
}
UDT is a marker interface that needs to be embedded in a struct if you want to marshal or unmarshal it as a User Defined Type.
Example ¶
// Just add gocqlx.UDT to a type, no need to implement marshalling functions type FullName struct { gocqlx.UDT FirstName string LastName string }
Output:
Example (Wraper) ¶
type FullName struct { FirstName string LastName string } // Create new UDT wrapper type type FullNameUDT struct { gocqlx.UDT *FullName }
Output:
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
cmd
|
|
Package dbutil provides various utilities built on top of core gocqlx modules.
|
Package dbutil provides various utilities built on top of core gocqlx modules. |
Package gocqlxtest provides test helpers for integration tests.
|
Package gocqlxtest provides test helpers for integration tests. |
Package migrate reads migrations from a flat directory containing CQL files.
|
Package migrate reads migrations from a flat directory containing CQL files. |
Package qb provides CQL query builders.
|
Package qb provides CQL query builders. |
Package table adds support for super simple CRUD operations based on table model.
|
Package table adds support for super simple CRUD operations based on table model. |