Package datastore
Overview ▹
Index ▹
Constants
ScopeDatastore grants permissions to view and/or manage datastore entities
const ScopeDatastore = "https://www.googleapis.com/auth/datastore"
Variables
var ( // ErrInvalidEntityType is returned when functions like Get or Next are // passed a dst or src argument of invalid type. ErrInvalidEntityType = errors.New("datastore: invalid entity type") // ErrInvalidKey is returned when an invalid key is presented. ErrInvalidKey = errors.New("datastore: invalid key") // ErrNoSuchEntity is returned when no entity was found for a given key. ErrNoSuchEntity = errors.New("datastore: no such entity") )
ErrConcurrentTransaction is returned when a transaction is rolled back due to a conflict with a concurrent transaction.
var ErrConcurrentTransaction = errors.New("datastore: concurrent transaction")
func LoadStruct ¶
func LoadStruct(dst interface{}, p []Property) error
LoadStruct loads the properties from p to dst. dst must be a struct pointer.
The values of dst's unmatched struct fields are not modified, and matching slice-typed fields are not reset before appending to them. In particular, it is recommended to pass a pointer to a zero valued struct on each LoadStruct call.
▹ Example
func SaveStruct ¶
func SaveStruct(src interface{}) ([]Property, error)
SaveStruct returns the properties from src as a slice of Properties. src must be a struct pointer.
▹ Example
type Client ¶
Client is a client for reading and writing data in a datastore dataset.
type Client struct {
// contains filtered or unexported fields
}
func NewClient ¶
func NewClient(ctx context.Context, projectID string, opts ...option.ClientOption) (*Client, error)
NewClient creates a new Client for a given dataset. If the project ID is empty, it is derived from the DATASTORE_PROJECT_ID environment variable. If the DATASTORE_EMULATOR_HOST environment variable is set, client will use its value to connect to a locally-running datastore emulator.
▹ Example
func (*Client) AllocateIDs ¶
func (c *Client) AllocateIDs(ctx context.Context, keys []*Key) ([]*Key, error)
AllocateIDs accepts a slice of incomplete keys and returns a slice of complete keys that are guaranteed to be valid in the datastore.
▹ Example
func (*Client) Close ¶
func (c *Client) Close() error
Close closes the Client.
func (*Client) Count ¶
func (c *Client) Count(ctx context.Context, q *Query) (int, error)
Count returns the number of results for the given query.
The running time and number of API calls made by Count scale linearly with with the sum of the query's offset and limit. Unless the result count is expected to be small, it is best to specify a limit; otherwise Count will continue until it finishes counting or the provided context expires.
▹ Example
func (*Client) Delete ¶
func (c *Client) Delete(ctx context.Context, key *Key) error
Delete deletes the entity for the given key.
▹ Example
func (*Client) DeleteMulti ¶
func (c *Client) DeleteMulti(ctx context.Context, keys []*Key) error
DeleteMulti is a batch version of Delete.
▹ Example
func (*Client) Get ¶
func (c *Client) Get(ctx context.Context, key *Key, dst interface{}) error
Get loads the entity stored for key into dst, which must be a struct pointer or implement PropertyLoadSaver. If there is no such entity for the key, Get returns ErrNoSuchEntity.
The values of dst's unmatched struct fields are not modified, and matching slice-typed fields are not reset before appending to them. In particular, it is recommended to pass a pointer to a zero valued struct on each Get call.
ErrFieldMismatch is returned when a field is to be loaded into a different type than the one it was stored from, or when a field is missing or unexported in the destination struct. ErrFieldMismatch is only returned if dst is a struct pointer.
▹ Example
func (*Client) GetAll ¶
func (c *Client) GetAll(ctx context.Context, q *Query, dst interface{}) ([]*Key, error)
GetAll runs the provided query in the given context and returns all keys that match that query, as well as appending the values to dst.
dst must have type *[]S or *[]*S or *[]P, for some struct type S or some non- interface, non-pointer type P such that P or *P implements PropertyLoadSaver.
As a special case, *PropertyList is an invalid type for dst, even though a PropertyList is a slice of structs. It is treated as invalid to avoid being mistakenly passed when *[]PropertyList was intended.
The keys returned by GetAll will be in a 1-1 correspondence with the entities added to dst.
If q is a “keys-only” query, GetAll ignores dst and only returns the keys.
The running time and number of API calls made by GetAll scale linearly with with the sum of the query's offset and limit. Unless the result count is expected to be small, it is best to specify a limit; otherwise GetAll will continue until it finishes collecting results or the provided context expires.
▹ Example
func (*Client) GetMulti ¶
func (c *Client) GetMulti(ctx context.Context, keys []*Key, dst interface{}) error
GetMulti is a batch version of Get.
dst must be a []S, []*S, []I or []P, for some struct type S, some interface type I, or some non-interface non-pointer type P such that P or *P implements PropertyLoadSaver. If an []I, each element must be a valid dst for Get: it must be a struct pointer or implement PropertyLoadSaver.
As a special case, PropertyList is an invalid type for dst, even though a PropertyList is a slice of structs. It is treated as invalid to avoid being mistakenly passed when []PropertyList was intended.
▹ Example
func (*Client) NewTransaction ¶
func (c *Client) NewTransaction(ctx context.Context, opts ...TransactionOption) (*Transaction, error)
NewTransaction starts a new transaction.
▹ Example
func (*Client) Put ¶
func (c *Client) Put(ctx context.Context, key *Key, src interface{}) (*Key, error)
Put saves the entity src into the datastore with key k. src must be a struct pointer or implement PropertyLoadSaver; if a struct pointer then any unexported fields of that struct will be skipped. If k is an incomplete key, the returned key will be a unique key generated by the datastore.
▹ Example
▹ Example (Flatten)
func (*Client) PutMulti ¶
func (c *Client) PutMulti(ctx context.Context, keys []*Key, src interface{}) ([]*Key, error)
PutMulti is a batch version of Put.
src must satisfy the same conditions as the dst argument to GetMulti.
▹ Example (InterfaceSlice)
▹ Example (Slice)
func (*Client) Run ¶
func (c *Client) Run(ctx context.Context, q *Query) *Iterator
Run runs the given query in the given context.
▹ Example
func (*Client) RunInTransaction ¶
func (c *Client) RunInTransaction(ctx context.Context, f func(tx *Transaction) error, opts ...TransactionOption) (*Commit, error)
RunInTransaction runs f in a transaction. f is invoked with a Transaction that f should use for all the transaction's datastore operations.
f must not call Commit or Rollback on the provided Transaction.
If f returns nil, RunInTransaction commits the transaction, returning the Commit and a nil error if it succeeds. If the commit fails due to a conflicting transaction, RunInTransaction retries f with a new Transaction. It gives up and returns ErrConcurrentTransaction after three failed attempts (or as configured with MaxAttempts).
If f returns non-nil, then the transaction will be rolled back and RunInTransaction will return the same error. The function f is not retried.
Note that when f returns, the transaction is not committed. Calling code must not assume that any of f's changes have been committed until RunInTransaction returns nil.
Since f may be called multiple times, f should usually be idempotent – that is, it should have the same result when called multiple times. Note that Transaction.Get will append when unmarshalling slice fields, so it is not necessarily idempotent.
▹ Example
type Commit ¶
Commit represents the result of a committed transaction.
type Commit struct{}
func (*Commit) Key ¶
func (c *Commit) Key(p *PendingKey) *Key
Key resolves a pending key handle into a final key.
▹ Example
type Cursor ¶
Cursor is an iterator's position. It can be converted to and from an opaque string. A cursor can be used from different HTTP requests, but only with a query with the same kind, ancestor, filter and order constraints.
The zero Cursor can be used to indicate that there is no start and/or end constraint for a query.
type Cursor struct {
// contains filtered or unexported fields
}
func DecodeCursor ¶
func DecodeCursor(s string) (Cursor, error)
Decode decodes a cursor from its base-64 string representation.
▹ Example
func (Cursor) String ¶
func (c Cursor) String() string
String returns a base-64 string representation of a cursor.
type Entity ¶
An Entity is the value type for a nested struct. This type is only used for a Property's Value.
type Entity struct { Key *Key Properties []Property }
type ErrFieldMismatch ¶
ErrFieldMismatch is returned when a field is to be loaded into a different type than the one it was stored from, or when a field is missing or unexported in the destination struct. StructType is the type of the struct pointed to by the destination argument passed to Get or to Iterator.Next.
type ErrFieldMismatch struct { StructType reflect.Type FieldName string Reason string }
func (*ErrFieldMismatch) Error ¶
func (e *ErrFieldMismatch) Error() string
type GeoPoint ¶
GeoPoint represents a location as latitude/longitude in degrees.
type GeoPoint struct { Lat, Lng float64 }
func (GeoPoint) Valid ¶
func (g GeoPoint) Valid() bool
Valid returns whether a GeoPoint is within [-90, 90] latitude and [-180, 180] longitude.
type Iterator ¶
Iterator is the result of running a query.
type Iterator struct {
// contains filtered or unexported fields
}
func (*Iterator) Cursor ¶
func (t *Iterator) Cursor() (Cursor, error)
Cursor returns a cursor for the iterator's current location.
▹ Example
func (*Iterator) Next ¶
func (t *Iterator) Next(dst interface{}) (*Key, error)
Next returns the key of the next result. When there are no more results, iterator.Done is returned as the error.
If the query is not keys only and dst is non-nil, it also loads the entity stored for that key into the struct pointer or PropertyLoadSaver dst, with the same semantics and possible errors as for the Get function.
▹ Example
type Key ¶
Key represents the datastore key for a stored entity.
type Key struct { // Kind cannot be empty. Kind string // Either ID or Name must be zero for the Key to be valid. // If both are zero, the Key is incomplete. ID int64 Name string // Parent must either be a complete Key or nil. Parent *Key // Namespace provides the ability to partition your data for multiple // tenants. In most cases, it is not necessary to specify a namespace. // See docs on datastore multitenancy for details: // https://cloud.google.com/datastore/docs/concepts/multitenancy Namespace string }
func DecodeKey ¶
func DecodeKey(encoded string) (*Key, error)
DecodeKey decodes a key from the opaque representation returned by Encode.
▹ Example
func IDKey ¶
func IDKey(kind string, id int64, parent *Key) *Key
IDKey creates a new key with an ID. The supplied kind cannot be empty. The supplied parent must either be a complete key or nil. The namespace of the new key is empty.
▹ Example
func IncompleteKey ¶
func IncompleteKey(kind string, parent *Key) *Key
IncompleteKey creates a new incomplete key. The supplied kind cannot be empty. The namespace of the new key is empty.
▹ Example
func NameKey ¶
func NameKey(kind, name string, parent *Key) *Key
NameKey creates a new key with a name. The supplied kind cannot be empty. The supplied parent must either be a complete key or nil. The namespace of the new key is empty.
▹ Example
func (*Key) Encode ¶
func (k *Key) Encode() string
Encode returns an opaque representation of the key suitable for use in HTML and URLs. This is compatible with the Python and Java runtimes.
▹ Example
func (*Key) Equal ¶
func (k *Key) Equal(o *Key) bool
Equal reports whether two keys are equal. Two keys are equal if they are both nil, or if their kinds, IDs, names, namespaces and parents are equal.
func (*Key) GobDecode ¶
func (k *Key) GobDecode(buf []byte) error
GobDecode unmarshals a sequence of bytes using an encoding/gob.Decoder.
func (*Key) GobEncode ¶
func (k *Key) GobEncode() ([]byte, error)
GobEncode marshals the key into a sequence of bytes using an encoding/gob.Encoder.
func (*Key) Incomplete ¶
func (k *Key) Incomplete() bool
Incomplete reports whether the key does not refer to a stored entity.
func (*Key) MarshalJSON ¶
func (k *Key) MarshalJSON() ([]byte, error)
MarshalJSON marshals the key into JSON.
func (*Key) String ¶
func (k *Key) String() string
String returns a string representation of the key.
func (*Key) UnmarshalJSON ¶
func (k *Key) UnmarshalJSON(buf []byte) error
UnmarshalJSON unmarshals a key JSON object into a Key.
type KeyLoader ¶
KeyLoader can store a Key.
type KeyLoader interface { // PropertyLoadSaver is embedded because a KeyLoader // must also always implement PropertyLoadSaver. PropertyLoadSaver LoadKey(k *Key) error }
type MultiError ¶
MultiError is returned by batch operations when there are errors with particular elements. Errors will be in a one-to-one correspondence with the input elements; successful elements will have a nil entry.
type MultiError []error
func (MultiError) Error ¶
func (m MultiError) Error() string
type PendingKey ¶
PendingKey represents the key for newly-inserted entity. It can be resolved into a Key by calling the Key method of Commit.
type PendingKey struct {
// contains filtered or unexported fields
}
type Property ¶
Property is a name/value pair plus some metadata. A datastore entity's contents are loaded and saved as a sequence of Properties. Each property name must be unique within an entity.
type Property struct { // Name is the property name. Name string // Value is the property value. The valid types are: // - int64 // - bool // - string // - float64 // - *Key // - time.Time // - GeoPoint // - []byte (up to 1 megabyte in length) // - *Entity (representing a nested struct) // Value can also be: // - []interface{} where each element is one of the above types // This set is smaller than the set of valid struct field types that the // datastore can load and save. A Value's type must be explicitly on // the list above; it is not sufficient for the underlying type to be // on that list. For example, a Value of "type myInt64 int64" is // invalid. Smaller-width integers and floats are also invalid. Again, // this is more restrictive than the set of valid struct field types. // // A Value will have an opaque type when loading entities from an index, // such as via a projection query. Load entities into a struct instead // of a PropertyLoadSaver when using a projection query. // // A Value may also be the nil interface value; this is equivalent to // Python's None but not directly representable by a Go struct. Loading // a nil-valued property into a struct will set that field to the zero // value. Value interface{} // NoIndex is whether the datastore cannot index this property. // If NoIndex is set to false, []byte and string values are limited to // 1500 bytes. NoIndex bool }
type PropertyList ¶
PropertyList converts a []Property to implement PropertyLoadSaver.
type PropertyList []Property
func (*PropertyList) Load ¶
func (l *PropertyList) Load(p []Property) error
Load loads all of the provided properties into l. It does not first reset *l to an empty slice.
func (*PropertyList) Save ¶
func (l *PropertyList) Save() ([]Property, error)
Save saves all of l's properties as a slice of Properties.
type PropertyLoadSaver ¶
PropertyLoadSaver can be converted from and to a slice of Properties.
type PropertyLoadSaver interface { Load([]Property) error Save() ([]Property, error) }
type Query ¶
Query represents a datastore query.
type Query struct {
// contains filtered or unexported fields
}
func NewQuery ¶
func NewQuery(kind string) *Query
NewQuery creates a new Query for a specific entity kind.
An empty kind means to return all entities, including entities created and managed by other App Engine features, and is called a kindless query. Kindless queries cannot include filters or sort orders on property values.
▹ Example
▹ Example (Options)
func (*Query) Ancestor ¶
func (q *Query) Ancestor(ancestor *Key) *Query
Ancestor returns a derivative query with an ancestor filter. The ancestor should not be nil.
func (*Query) Distinct ¶
func (q *Query) Distinct() *Query
Distinct returns a derivative query that yields de-duplicated entities with respect to the set of projected fields. It is only used for projection queries. Distinct cannot be used with DistinctOn.
func (*Query) DistinctOn ¶
func (q *Query) DistinctOn(fieldNames ...string) *Query
DistinctOn returns a derivative query that yields de-duplicated entities with respect to the set of the specified fields. It is only used for projection queries. The field list should be a subset of the projected field list. DistinctOn cannot be used with Distinct.
func (*Query) End ¶
func (q *Query) End(c Cursor) *Query
End returns a derivative query with the given end point.
func (*Query) EventualConsistency ¶
func (q *Query) EventualConsistency() *Query
EventualConsistency returns a derivative query that returns eventually consistent results. It only has an effect on ancestor queries.
func (*Query) Filter ¶
func (q *Query) Filter(filterStr string, value interface{}) *Query
Filter returns a derivative query with a field-based filter. The filterStr argument must be a field name followed by optional space, followed by an operator, one of ">", "<", ">=", "<=", or "=". Fields are compared against the provided value using the operator. Multiple filters are AND'ed together. Field names which contain spaces, quote marks, or operator characters should be passed as quoted Go string literals as returned by strconv.Quote or the fmt package's %q verb.
func (*Query) KeysOnly ¶
func (q *Query) KeysOnly() *Query
KeysOnly returns a derivative query that yields only keys, not keys and entities. It cannot be used with projection queries.
func (*Query) Limit ¶
func (q *Query) Limit(limit int) *Query
Limit returns a derivative query that has a limit on the number of results returned. A negative value means unlimited.
func (*Query) Namespace ¶
func (q *Query) Namespace(ns string) *Query
Namespace returns a derivative query that is associated with the given namespace.
A namespace may be used to partition data for multi-tenant applications. For details, see https://cloud.google.com/datastore/docs/concepts/multitenancy.
func (*Query) Offset ¶
func (q *Query) Offset(offset int) *Query
Offset returns a derivative query that has an offset of how many keys to skip over before returning results. A negative value is invalid.
func (*Query) Order ¶
func (q *Query) Order(fieldName string) *Query
Order returns a derivative query with a field-based sort order. Orders are applied in the order they are added. The default order is ascending; to sort in descending order prefix the fieldName with a minus sign (-). Field names which contain spaces, quote marks, or the minus sign should be passed as quoted Go string literals as returned by strconv.Quote or the fmt package's %q verb.
func (*Query) Project ¶
func (q *Query) Project(fieldNames ...string) *Query
Project returns a derivative query that yields only the given fields. It cannot be used with KeysOnly.
func (*Query) Start ¶
func (q *Query) Start(c Cursor) *Query
Start returns a derivative query with the given start point.
▹ Example
func (*Query) Transaction ¶
func (q *Query) Transaction(t *Transaction) *Query
Transaction returns a derivative query that is associated with the given transaction.
All reads performed as part of the transaction will come from a single consistent snapshot. Furthermore, if the transaction is set to a serializable isolation level, another transaction cannot concurrently modify the data that is read or modified by this transaction.
type Transaction ¶
Transaction represents a set of datastore operations to be committed atomically.
Operations are enqueued by calling the Put and Delete methods on Transaction (or their Multi-equivalents). These operations are only committed when the Commit method is invoked. To ensure consistency, reads must be performed by using Transaction's Get method or by using the Transaction method when building a query.
A Transaction must be committed or rolled back exactly once.
type Transaction struct {
// contains filtered or unexported fields
}
func (*Transaction) Commit ¶
func (t *Transaction) Commit() (*Commit, error)
Commit applies the enqueued operations atomically.
func (*Transaction) Delete ¶
func (t *Transaction) Delete(key *Key) error
Delete is the transaction-specific version of the package function Delete. Delete enqueues the deletion of the entity for the given key, to be committed atomically upon calling Commit.
func (*Transaction) DeleteMulti ¶
func (t *Transaction) DeleteMulti(keys []*Key) error
DeleteMulti is a batch version of Delete.
func (*Transaction) Get ¶
func (t *Transaction) Get(key *Key, dst interface{}) error
Get is the transaction-specific version of the package function Get. All reads performed during the transaction will come from a single consistent snapshot. Furthermore, if the transaction is set to a serializable isolation level, another transaction cannot concurrently modify the data that is read or modified by this transaction.
func (*Transaction) GetMulti ¶
func (t *Transaction) GetMulti(keys []*Key, dst interface{}) error
GetMulti is a batch version of Get.
func (*Transaction) Put ¶
func (t *Transaction) Put(key *Key, src interface{}) (*PendingKey, error)
Put is the transaction-specific version of the package function Put.
Put returns a PendingKey which can be resolved into a Key using the return value from a successful Commit. If key is an incomplete key, the returned pending key will resolve to a unique key generated by the datastore.
func (*Transaction) PutMulti ¶
func (t *Transaction) PutMulti(keys []*Key, src interface{}) ([]*PendingKey, error)
PutMulti is a batch version of Put. One PendingKey is returned for each element of src in the same order.
func (*Transaction) Rollback ¶
func (t *Transaction) Rollback() error
Rollback abandons a pending transaction.
type TransactionOption ¶
TransactionOption configures the way a transaction is executed.
type TransactionOption interface {
// contains filtered or unexported methods
}
func MaxAttempts ¶
func MaxAttempts(attempts int) TransactionOption
MaxAttempts returns a TransactionOption that overrides the default 3 attempt times.