diff --git a/iterx.go b/iterx.go index 5f99d06..9ebfedf 100644 --- a/iterx.go +++ b/iterx.go @@ -13,7 +13,7 @@ import ( "github.com/scylladb/go-reflectx" ) -// DefaultUnsafe enables the behavior of forcing the iterator to ignore +// DefaultUnsafe enables the behavior of forcing queries and iterators to ignore // missing fields for all queries. See Unsafe below for more information. var DefaultUnsafe bool diff --git a/iterx_test.go b/iterx_test.go index 59ecfa5..d8652a0 100644 --- a/iterx_test.go +++ b/iterx_test.go @@ -484,12 +484,8 @@ func TestIterxUnsafe(t *testing.T) { }) t.Run("select default unsafe", func(t *testing.T) { - gocqlx.DefaultUnsafe = true - defer func() { - gocqlx.DefaultUnsafe = false - }() var v []UnsafeTable - err := session.Query(stmt, nil).Iter().Select(&v) + err := session.Query(stmt, nil).Unsafe().Iter().Select(&v) if err != nil { t.Fatal("Select() failed:", err) } diff --git a/queryx.go b/queryx.go index 7d8809f..331512c 100644 --- a/queryx.go +++ b/queryx.go @@ -94,7 +94,8 @@ type Queryx struct { tr Transformer Mapper *reflectx.Mapper *gocql.Query - Names []string + Names []string + unsafe bool } // Query creates a new Queryx from gocql.Query using a default mapper. @@ -106,6 +107,7 @@ func Query(q *gocql.Query, names []string) *Queryx { Names: names, Mapper: DefaultMapper, tr: DefaultBindTransformer, + unsafe: DefaultUnsafe, } } @@ -209,7 +211,7 @@ func (q *Queryx) bindMapArgs(arg map[string]interface{}) ([]interface{}, error) // Bind sets query arguments of query. This can also be used to rebind new query arguments // to an existing query instance. func (q *Queryx) Bind(v ...interface{}) *Queryx { - q.Query.Bind(udtWrapSlice(q.Mapper, DefaultUnsafe, v)...) + q.Query.Bind(udtWrapSlice(q.Mapper, q.unsafe, v)...) return q } @@ -342,6 +344,14 @@ func (q *Queryx) Iter() *Iterx { return &Iterx{ Iter: q.Query.Iter(), Mapper: q.Mapper, - unsafe: DefaultUnsafe, + unsafe: q.unsafe, } } + +// Unsafe forces the query and iterators to ignore missing fields. By default when scanning +// a struct if result row has a column that cannot be mapped to any destination +// field an error is reported. With unsafe such columns are ignored. +func (q *Queryx) Unsafe() *Queryx { + q.unsafe = true + return q +} diff --git a/session.go b/session.go index aef880a..cb82c3c 100644 --- a/session.go +++ b/session.go @@ -51,6 +51,7 @@ func (s Session) ContextQuery(ctx context.Context, stmt string, names []string) Names: names, Mapper: s.Mapper, tr: DefaultBindTransformer, + unsafe: DefaultUnsafe, } } @@ -65,6 +66,7 @@ func (s Session) Query(stmt string, names []string) *Queryx { Names: names, Mapper: s.Mapper, tr: DefaultBindTransformer, + unsafe: DefaultUnsafe, } }