Paket google.golang.org/appengine/datastore (v1.6.8)

Datastore paket menyediakan klien untuk layanan datastore App Engine.

Operasi Dasar

Entitas adalah unit penyimpanan dan dikaitkan dengan kunci. Kunci terdiri dari kunci induk opsional, ID aplikasi string, jenis string (juga dikenal sebagai jenis entity), dan StringID atau IntID. StringID juga dikenal sebagai nama entitas atau nama kunci.

Kunci dengan StringID nol dan IntID nol dapat dibuat; ini disebut kunci yang tidak lengkap, dan tidak merujuk ke entitas tersimpan mana pun. Memasukkan entity ke dalam datastore di bawah kunci yang tidak lengkap akan menyebabkan kunci unik dibuat untuk entity tersebut, dengan IntID bukan nol.

Konten entity adalah pemetaan dari nama kolom yang peka huruf besar/kecil ke nilai. Jenis nilai yang valid adalah:

  • bilangan bulat yang ditandatangani (int, int8, int16, int32 dan int64),
  • bool,
  • string,
  • float32 dan float64,
  • []byte (panjang hingga 1 megabyte),
  • jenis apa pun yang tipe dasarnya adalah salah satu dari jenis yang telah dideklarasikan di atas,
  • ByteString,
  • *Kunci,
  • time.Time (disimpan dengan presisi mikrodetik),
  • appengine.BlobKey,
  • appengine.GeoPoint,
  • struktur yang kolomnya semuanya merupakan jenis nilai yang valid,
  • slice dari salah satu di atas.

Slice struct bersifat valid, begitu juga struct yang berisi slice. Namun, jika satu struktur berisi struktur lain, maksimal salah satunya dapat diulang. Ini akan mendiskualifikasi jenis struct yang ditentukan secara rekursif: struct T apa pun yang (secara langsung atau tidak langsung) berisi []T.

Fungsi Get and Put memuat dan menyimpan konten entity. Konten entity biasanya direpresentasikan oleh pointer struct.

Contoh kode:

type Entity struct {
    Value string
}

func handle(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)

    k := datastore.NewKey(ctx, "Entity", "stringID", 0, nil)
    e := new(Entity)
    if err := datastore.Get(ctx, k, e); err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    old := e.Value
    e.Value = r.URL.Path

    if _, err := datastore.Put(ctx, k, e); err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    fmt.Fprintf(w, "old=%q\nnew=%q\n", old, e.Value)
}

GetMulti, PutMulti, dan DeleteMulti adalah versi batch dari fungsi Get, Put, dan Delete. Fungsi ini mengambil []*Key, bukan *Key, dan mungkin menampilkan appengine.MultiError saat mengalami kegagalan parsial.

Properti

Konten suatu entitas dapat diwakili oleh berbagai jenis. Ini biasanya merupakan pointer struct, tetapi juga bisa berupa jenis apa pun yang mengimplementasikan antarmuka PropertyLoadSaver. Jika menggunakan pointer struct, Anda tidak perlu mengimplementasikan antarmuka PropertyLoadSaver secara eksplisit; datastore akan otomatis dikonversi melalui refleksi. Jika pointer struct menerapkan antarmuka tersebut, metode tersebut akan digunakan, bukan perilaku default untuk pointer struct. Pointer struktur diketik lebih kuat dan lebih mudah digunakan; PropertyLoadSavers lebih fleksibel.

Jenis sebenarnya yang diteruskan tidak harus cocok antara panggilan Get dan Put, atau bahkan di berbagai panggilan ke datastore. Sifatnya valid apabila menempatkan *PropertyList dan mendapatkan entity yang sama seperti *myStruct, atau menempatkan *myStruct0 dan mendapatkan *myStruct1. Secara konsep, setiap entity disimpan sebagai urutan properti, dan dimuat ke nilai tujuan berdasarkan properti demi properti. Saat memuat ke penunjuk struct, entity yang tidak dapat ditampilkan sepenuhnya (seperti kolom yang tidak ada) akan menyebabkan error ErrFieldMismatch, tetapi tergantung pemanggil apakah error ini bersifat fatal atau dapat dipulihkan atau dapat diabaikan.

Secara default, untuk pointer struct, semua properti berpotensi diindeks, dan nama propertinya sama dengan nama kolom (sehingga harus diawali dengan huruf besar).

Kolom mungkin berisi tag datastore:"name,options". Nama tag adalah nama properti, yang harus berupa satu atau beberapa ID Go valid yang digabungkan dengan ".", tetapi dapat dimulai dengan huruf kecil. Nama tag kosong berarti hanya menggunakan nama kolom. Nama tag "-" berarti datastore akan mengabaikan kolom tersebut.

Satu-satunya opsi yang valid adalah "omitempty" dan "noindex".

Jika opsi menyertakan "omitempty" dan nilai kolom kosong, kolom tersebut akan dihilangkan dari Simpan. Nilai kosong adalah false, 0, nilai antarmuka nil, dan array, slice, peta, atau string dengan panjang nol. Nilai kolom Struktur tidak akan pernah kosong.

Jika opsi menyertakan "noindex", kolom tersebut tidak akan diindeks. Semua kolom diindeks secara default. String atau irisan byte yang lebih panjang dari 1.500 byte tidak dapat diindeks; kolom yang digunakan untuk menyimpan string panjang dan irisan byte harus diberi tag "noindex" atau akan menyebabkan operasi Put gagal.

Untuk menggunakan beberapa opsi secara bersamaan, pisahkan opsi tersebut dengan koma. Urutannya tidak menjadi masalah.

Jika opsinya adalah "" maka koma dapat dihilangkan.

Contoh kode:

// A and B are renamed to a and b.
// A, C and J are not indexed.
// D's tag is equivalent to having no tag at all (E).
// I is ignored entirely by the datastore.
// J has tag information for both the datastore and json packages.
type TaggedStruct struct {
    A int `datastore:"a,noindex"`
    B int `datastore:"b"`
    C int `datastore:",noindex"`
    D int `datastore:""`
    E int
    I int `datastore:"-"`
    J int `datastore:",noindex" json:"j"`
}

Properti Terstruktur

Jika struct tersebut mengarah ke struktur lain, struct bertingkat atau tersemat akan diratakan. Misalnya, dengan definisi berikut:

type Inner1 struct {
    W int32
    X string
}

type Inner2 struct {
    Y float64
}

type Inner3 struct {
    Z bool
}

type Outer struct {
    A int16
    I []Inner1
    J Inner2
    Inner3
}

maka properti Outer akan setara dengan properti dari:

type OuterEquivalent struct {
    A     int16
    IDotW []int32  `datastore:"I.W"`
    IDotX []string `datastore:"I.X"`
    JDotY float64  `datastore:"J.Y"`
    Z     bool
}

Jika kolom Inner3 tersemat dari Luar diberi tag datastore:"Foo", maka kolom yang setara akan menjadi: FooDotZ bool datastore:"Foo.Z".

Jika struct luar diberi tag "noindex", semua kolom yang disatukan secara implisit secara efektif akan menjadi "noindex".

Antarmuka PropertyLoadSaver

Konten entity juga dapat direpresentasikan oleh jenis apa pun yang mengimplementasikan antarmuka PropertyLoadSaver. Jenis ini mungkin berupa pointer struct, tetapi sebenarnya tidak demikian. Paket datastore akan memanggil Load saat mendapatkan konten entity, dan Save saat menempatkan konten entity. Penggunaan yang memungkinkan mencakup mendapatkan kolom yang tidak disimpan, memverifikasi kolom, atau mengindeks kolom hanya jika nilainya positif.

Contoh kode:

type CustomPropsExample struct {
    I, J int
    // Sum is not stored, but should always be equal to I + J.
    Sum int `datastore:"-"`
}

func (x *CustomPropsExample) Load(ps []datastore.Property) error {
    // Load I and J as usual.
    if err := datastore.LoadStruct(x, ps); err != nil {
        return err
    }
    // Derive the Sum field.
    x.Sum = x.I + x.J
    return nil
}

func (x *CustomPropsExample) Save() ([]datastore.Property, error) {
    // Validate the Sum field.
    if x.Sum != x.I + x.J {
        return nil, errors.New("CustomPropsExample has inconsistent sum")
    }
    // Save I and J as usual. The code below is equivalent to calling
    // "return datastore.SaveStruct(x)", but is done manually for
    // demonstration purposes.
    return []datastore.Property{
        {
            Name:  "I",
            Value: int64(x.I),
        },
        {
            Name:  "J",
            Value: int64(x.J),
        },
    }, nil
}

Jenis *PropertyList mengimplementasikan PropertyLoadSaver, sehingga dapat menyimpan konten entitas arbitrer.

Kueri

Kueri mengambil entity berdasarkan properti atau ancestor kuncinya. Menjalankan kueri akan menghasilkan iterator hasil: pasangan kunci atau (kunci, entity). Kueri dapat digunakan kembali dan aman untuk memanggil Query.Run dari goroutine serentak. Iterator tidak aman untuk penggunaan serentak.

Kueri tidak dapat diubah, dan dibuat dengan memanggil NewQuery, atau berasal dari kueri yang sudah ada dengan memanggil metode seperti Filter atau Urutan yang menampilkan nilai kueri baru. Kueri biasanya dibuat dengan memanggil NewQuery yang diikuti oleh rantai nol atau beberapa metode serupa. Metode tersebut adalah:

  • Ancestor dan Filter membatasi entity yang ditampilkan dengan menjalankan kueri.
  • Urutan akan memengaruhi urutan kemunculan.
  • Project membatasi kolom yang ditampilkan.
  • Masing-masing menghapus duplikat entitas yang diproyeksikan.
  • KeysOnly membuat iterator hanya menampilkan kunci, bukan pasangan (kunci, entity).
  • Start, End, Offset, dan Limit menentukan sub-urutan entity yang cocok yang akan ditampilkan. Start dan End mengambil kursor, Offset dan Limit mengambil bilangan bulat. Start dan Offset memengaruhi hasil pertama, End dan Limit memengaruhi hasil terakhir. Jika Start dan Offset ditetapkan, maka offsetnya relatif terhadap Start. Jika End dan Limit ditetapkan, batasan paling awal akan menang. Batas berhubungan dengan Start+Offset, bukan relatif dengan End. Sebagai kasus khusus, batas negatif berarti tidak terbatas.

Contoh kode:

type Widget struct {
    Description string
    Price       int
}

func handle(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    q := datastore.NewQuery("Widget").
        Filter("Price <", 1000).
        Order("-Price")
    b := new(bytes.Buffer)
    for t := q.Run(ctx); ; {
        var x Widget
        key, err := t.Next(&x)
        if err == datastore.Done {
            break
        }
        if err != nil {
            serveError(ctx, w, err)
            return
        }
        fmt.Fprintf(b, "Key=%v\nWidget=%#v\n\n", key, x)
    }
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    io.Copy(w, b)
}

Transaksi

RunInTransaction menjalankan fungsi dalam transaksi.

Contoh kode:

type Counter struct {
    Count int
}

func inc(ctx context.Context, key *datastore.Key) (int, error) {
    var x Counter
    if err := datastore.Get(ctx, key, &x); err != nil && err != datastore.ErrNoSuchEntity {
        return 0, err
    }
    x.Count++
    if _, err := datastore.Put(ctx, key, &x); err != nil {
        return 0, err
    }
    return x.Count, nil
}

func handle(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    var count int
    err := datastore.RunInTransaction(ctx, func(ctx context.Context) error {
        var err1 error
        count, err1 = inc(ctx, datastore.NewKey(ctx, "Counter", "singleton", 0, nil))
        return err1
    }, nil)
    if err != nil {
        serveError(ctx, w, err)
        return
    }
    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    fmt.Fprintf(w, "Count=%d", count)
}

Metadata

Paket datastore memberikan akses ke beberapa metadata datastore App Engine. Metadata ini mencakup informasi tentang entity group, namespace, jenis entity, dan properti di datastore, serta representasi properti untuk setiap properti.

Contoh kode:

func handle(w http.ResponseWriter, r *http.Request) {
    // Print all the kinds in the datastore, with all the indexed
    // properties (and their representations) for each.
    ctx := appengine.NewContext(r)

    kinds, err := datastore.Kinds(ctx)
    if err != nil {
        serveError(ctx, w, err)
        return
    }

    w.Header().Set("Content-Type", "text/plain; charset=utf-8")
    for _, kind := range kinds {
        fmt.Fprintf(w, "%s:\n", kind)
        props, err := datastore.KindProperties(ctx, kind)
        if err != nil {
            fmt.Fprintln(w, "\t(unable to retrieve properties)")
            continue
        }
        for p, rep := range props {
            fmt.Fprintf(w, "\t-%s (%s)\n", p, strings.Join(rep, ", "))
        }
    }
}

Variabel

ErrInvalidEntityType, ErrInvalidKey, ErrNoSuchEntity

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")
)

Selesai

var Done = errors.New("datastore: query has no more results")

Doneakan ditampilkan ketika iterasi kueri telah selesai.

ErrConcurrentTransaction

var ErrConcurrentTransaction = errors.New("datastore: concurrent transaction")

ErrConcurrentTransaction ditampilkan saat transaksi di-roll back karena konflik dengan transaksi serentak.

Functions

func AllocateIDRange

func AllocateIDRange(c context.Context, kind string, parent *Key, start, end int64) (err error)

AllocateIDRange mengalokasikan rentang ID dengan endpoint spesifik. Rentang tersebut bersifat inklusif, baik di tingkat rendah maupun tinggi. Setelah ID ini dialokasikan, Anda dapat menetapkannya secara manual ke entitas yang baru dibuat.

Alokasi ID otomatis Datastore tidak pernah menetapkan kunci yang telah dialokasikan (baik melalui alokasi ID otomatis maupun melalui panggilan AllocateID Eksplisit). Akibatnya, entity yang ditulis ke rentang kunci yang diberikan tidak akan pernah ditimpa. Namun, penulisan entity dengan kunci yang ditetapkan secara manual dalam rentang ini dapat menimpa entity yang sudah ada (atau entity baru yang ditulis oleh permintaan terpisah), bergantung pada error yang ditampilkan.

Gunakan ini hanya jika Anda memiliki rentang ID numerik yang sudah ada yang ingin dicadangkan (misalnya, entitas pemuatan massal yang sudah memiliki ID). Jika Anda tidak pedulia ID apa yang akan Anda terima, gunakan AllocateID.

AllocateIDRange menampilkan nilai nil jika rentang berhasil dialokasikan. Jika satu atau beberapa entity dengan ID dalam rentang yang diberikan sudah ada, entity akan menampilkan KeyRangeCollisionError. Jika telah menyimpan ID dalam cache dalam rentang ini (misalnya dari panggilan sebelumnya ke AllocateIDRange), Datastore akan menampilkan KeyRangeContentionError. Error jenis lain menunjukkan masalah dengan argumen atau error yang ditampilkan langsung dari Datastore.

func AllocateIDs

func AllocateIDs(c context.Context, kind string, parent *Key, n int) (low, high int64, err error)

AllocateID menampilkan rentang ID bilangan bulat n dengan jenis yang diberikan dan kombinasi induk. jenis tidak boleh kosong; induk mungkin bernilai nil. ID dalam rentang yang ditampilkan tidak akan digunakan oleh generator urutan ID otomatis datastore dan dapat digunakan dengan NewKey tanpa konflik.

Rentang tersebut bersifat inklusif di rentang rendah dan eksklusif di kelas atas. Dengan kata lain, intID x yang valid memenuhi rendah <= x && x < tinggi.

Jika tidak ada error yang ditampilkan, rendah + n == tinggi.

func Delete

func Delete(c context.Context, key *Key) error

Delete akan menghapus entity untuk kunci yang ditentukan.

func DeleteMulti

func DeleteMulti(c context.Context, key []*Key) error

DeleteMulti adalah versi batch dari Delete.

func EnableKeyConversion

func EnableKeyConversion(ctx context.Context)

EnableKeyConversion mengaktifkan kompatibilitas kunci yang dienkode dengan library klien Cloud Datastore (cloud.google.com/go/datastore). Kunci terenkode yang dihasilkan oleh library klien Cloud Datastore akan didekodekan ke dalam kunci datastore App Engine.

Konteks yang disediakan harus berupa konteks App Engine jika berjalan di runtime generasi pertama App Engine. Ini dapat dipanggil dalam pengendali /_ah/start. Aman untuk dipanggil beberapa kali dan murah, sehingga juga dapat dimasukkan sebagai middleware.

Mengaktifkan kompatibilitas kunci tidak memengaruhi format encoding yang digunakan oleh Key.Encode, tetapi hanya memperluas jenis kunci yang dapat didekode dengan DecodeKey.

func Get

func Get(c context.Context, key *Key, dst interface{}) error

Memuat entity yang disimpan untuk k ke dst, yang harus berupa pointer struct atau mengimplementasikan PropertyLoadSaver. Jika tidak ada entity untuk kunci tersebut, Get akan menampilkan ErrNoSuchEntity.

Nilai kolom struct yang tidak cocok di dst tidak akan diubah, dan kolom berjenis slice yang cocok tidak direset sebelum menambahkannya. Secara khusus, sebaiknya teruskan pointer ke struct bernilai nol pada setiap panggilan Get.

ErrFieldMismatch ditampilkan saat sebuah kolom akan dimuat ke dalam jenis yang berbeda dengan tempat penyimpanannya, atau ketika kolom tidak ada atau tidak diekspor dalam struktur tujuan. ErrFieldMismatch hanya ditampilkan jika dst adalah pointer struct.

func GetMulti

func GetMulti(c context.Context, key []*Key, dst interface{}) error

GetMulti adalah versi batch dari Get.

dst harus berupa []S, []*S, []I, atau []P, untuk beberapa struct jenis S, beberapa antarmuka tipe I, atau beberapa non-antarmuka non-pointer jenis P sehingga P atau *P menerapkan PropertyLoadSaver. Jika []I, setiap elemen harus berupa dst yang valid untuk Get: elemen harus berupa pointer struct atau menerapkan PropertyLoadSaver.

Sebagai kasus khusus, PropertyList adalah jenis yang tidak valid untuk dst, meskipun PropertyList adalah bagian dari struct. Properti ini diperlakukan sebagai tidak valid agar tidak diteruskan secara tidak sengaja saat []PropertyList dimaksudkan.

func KindProperties

func KindProperties(ctx context.Context, kind string) (map[string][]string, error)

KindProperties menampilkan semua properti yang diindeks untuk jenis tertentu. Properti ditampilkan sebagai peta nama properti ke bagian jenis representasi. Jenis representasi untuk jenis properti Go yang didukung adalah:

"INT64":     signed integers and time.Time
"DOUBLE":    float32 and float64
"BOOLEAN":   bool
"STRING":    string, []byte and ByteString
"POINT":     appengine.GeoPoint
"REFERENCE": *Key
"USER":      (not used in the Go runtime)

func Kinds

func Kinds(ctx context.Context) ([]string, error)

Kinds menampilkan nama semua jenis dalam namespace saat ini.

func LoadStruct

func LoadStruct(dst interface{}, p []Property) error

LoadStruct memuat properti dari p ke dst. dst harus berupa pointer struct.

func Namespaces

func Namespaces(ctx context.Context) ([]string, error)

Namespaces menampilkan semua namespace datastore.

func RunInTransaction

func RunInTransaction(c context.Context, f func(tc context.Context) error, opts *TransactionOptions) error

RunInTransaction menjalankan f dalam transaksi. Fungsi ini memanggil f dengan tc konteks transaksi yang harus digunakan f untuk semua operasi App Engine.

Jika f menampilkan nil, RunInTransaction akan mencoba melakukan transaksi, menampilkan nil jika berhasil. Jika commit gagal karena transaksi yang bertentangan, RunInTransaction mencoba kembali f, setiap kali dengan konteks transaksi baru. Metode ini berhenti dan menampilkan ErrConcurrentTransaction setelah tiga upaya yang gagal. Jumlah percobaan dapat dikonfigurasi dengan menentukan TransactionOptions.Attempts.

Jika f menampilkan non-nil, perubahan datastore tidak akan diterapkan dan RunInTransaction menampilkan error yang sama. Fungsi f tidak dicoba lagi.

Perhatikan bahwa ketika f ditampilkan, transaksi belum di-commit. Kode panggilan harus berhati-hati agar tidak mengasumsikan bahwa perubahan f telah di-commit hingga RunInTransaction menampilkan nilai nil.

Karena f dapat dipanggil beberapa kali, f biasanya harus idempoten. datastore.Get tidak idempoten saat menguraikan kolom slice.

Transaksi bertingkat tidak didukung; c mungkin bukan konteks transaksi.

ByteString

type ByteString []byte

ByteString adalah slice byte pendek (hingga 1.500 byte) yang dapat diindeks.

Kursor

type Cursor struct {
	// contains filtered or unexported fields
}

Cursor adalah posisi iterator. File ini dapat dikonversi ke dan dari string buram. Kursor dapat digunakan dari berbagai permintaan HTTP, tetapi hanya dengan kueri dengan jenis, ancestor, filter, dan batasan urutan yang sama.

func DecodeCursor

func DecodeCursor(s string) (Cursor, error)

DecodeCursor mendekode kursor dari representasi string base-64-nya.

func (Cursor) String

func (c Cursor) String() string

String menampilkan representasi string base-64 dari kursor.

Entity

type Entity struct {
	Key        *Key
	Properties []Property
}

Entity adalah jenis nilai untuk struktur bertingkat. Jenis ini hanya digunakan untuk Nilai Properti.

ErrFieldMismatch

type ErrFieldMismatch struct {
	StructType reflect.Type
	FieldName  string
	Reason     string
}

ErrFieldMismatch ditampilkan saat sebuah kolom akan dimuat ke dalam jenis yang berbeda dengan tempat penyimpanannya, atau ketika kolom tidak ada atau tidak diekspor dalam struktur tujuan. StructType adalah jenis struct yang ditunjukkan oleh argumen tujuan yang diteruskan ke Get atau ke Iterator.Next.

func (*ErrFieldMismatch) Error

func (e *ErrFieldMismatch) Error() string

Iterator

type Iterator struct {
	// contains filtered or unexported fields
}

Iterator adalah hasil dari menjalankan kueri.

func (*Iterator) Cursor

func (t *Iterator) Cursor() (Cursor, error)

Cursor menampilkan kursor untuk lokasi iterator saat ini.

func (*Iterator) Next

func (t *Iterator) Next(dst interface{}) (*Key, error)

Next menampilkan kunci untuk hasil berikutnya. Jika tidak ada hasil lagi, Done ditampilkan sebagai error.

Jika kueri bukan hanya kunci dan dst bukan nil, kueri juga akan memuat entity yang disimpan untuk kunci tersebut ke dalam pointer struct atau PropertyLoadSaver dst, dengan semantik yang sama dan kemungkinan error seperti untuk fungsi Get.

Kunci

type Key struct {
	// contains filtered or unexported fields
}

Kunci mewakili kunci datastore untuk entity yang tersimpan, dan tidak dapat diubah.

func DecodeKey

func DecodeKey(encoded string) (*Key, error)

DecodeKey mendekode tombol dari representasi buram yang ditampilkan oleh Encode.

func NewIncompleteKey

func NewIncompleteKey(c context.Context, kind string, parent *Key) *Key

NewCompletedKey membuat kunci baru yang tidak lengkap. kind tidak boleh kosong.

func NewKey

func NewKey(c context.Context, kind, stringID string, intID int64, parent *Key) *Key

NewKey membuat kunci baru. kind tidak boleh kosong. Salah satu atau kedua stringID dan intID harus nol. Jika keduanya nol, kunci yang ditampilkan tidak lengkap. induk harus berupa kunci lengkap atau nil.

func Put

func Put(c context.Context, key *Key, src interface{}) (*Key, error)

Masukkan penyimpanan entity src ke dalam datastore dengan kunci k. src harus berupa pointer struct atau mengimplementasikan PropertyLoadSaver; jika pointer struct maka setiap kolom yang tidak diekspor dari struct tersebut akan dilewati. Jika k adalah kunci yang tidak lengkap, kunci yang ditampilkan akan menjadi kunci unik yang dihasilkan oleh datastore.

func PutMulti

func PutMulti(c context.Context, key []*Key, src interface{}) ([]*Key, error)

PutMulti adalah versi batch dari Put.

src harus memenuhi kondisi yang sama dengan argumen dst ke GetMulti.

func (*Key) AppID

func (k *Key) AppID() string

AppID menampilkan ID aplikasi kunci.

func (*Key) Encode

func (k *Key) Encode() string

Encode menampilkan representasi buram dari kunci yang sesuai untuk digunakan dalam HTML dan URL. Kode ini kompatibel dengan runtime Python dan Java.

func (*Key) Equal

func (k *Key) Equal(o *Key) bool

Equal menunjukkan apakah dua kunci sama.

func (*Key) GobDecode

func (k *Key) GobDecode(buf []byte) error

func (*Key) GobEncode

func (k *Key) GobEncode() ([]byte, error)

func (*Key) Incomplete

func (k *Key) Incomplete() bool

Incomplete menampilkan apakah kunci tidak merujuk pada entity yang disimpan. Khususnya, apakah kunci memiliki StringID nol dan IntID nol.

func (*Key) IntID

func (k *Key) IntID() int64

IntID menampilkan ID bilangan bulat kunci, yang mungkin bernilai 0.

func (*Key) Kind

func (k *Key) Kind() string

Kind menampilkan jenis kunci (juga dikenal sebagai jenis entity).

func (*Key) MarshalJSON

func (k *Key) MarshalJSON() ([]byte, error)

func (*Key) Namespace

func (k *Key) Namespace() string

Namespace menampilkan namespace kunci.

func (*Key) Parent

func (k *Key) Parent() *Key

Parent menampilkan kunci induk kunci, yang mungkin bernilai nil.

func (*Key) String

func (k *Key) String() string

String menampilkan representasi string dari kunci tersebut.

func (*Key) StringID

func (k *Key) StringID() string

StringID menampilkan ID string kunci (juga dikenal sebagai nama entity atau nama kunci), yang mungkin berupa "".

func (*Key) UnmarshalJSON

func (k *Key) UnmarshalJSON(buf []byte) error

KeyRangeCollisionError

type KeyRangeCollisionError struct {
	// contains filtered or unexported fields
}

func (*KeyRangeCollisionError) Error

func (e *KeyRangeCollisionError) Error() string

KeyRangeContentionError

type KeyRangeContentionError struct {
	// contains filtered or unexported fields
}

func (*KeyRangeContentionError) Error

func (e *KeyRangeContentionError) Error() string

Properti

type Property struct {
	// Name is the property name.
	Name string
	// Value is the property value. The valid types are:
	//	- int64
	//	- bool
	//	- string
	//	- float64
	//	- ByteString
	//	- *Key
	//	- time.Time
	//	- appengine.BlobKey
	//	- appengine.GeoPoint
	//	- []byte (up to 1 megabyte in length)
	//	- *Entity (representing a nested struct)
	// This set is smaller than the set of valid struct field types that the
	// datastore can load and save. A Property Value cannot be a slice (apart
	// from []byte); use multiple Properties instead. Also, 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.
	NoIndex bool
	// Multiple is whether the entity can have multiple properties with
	// the same name. Even if a particular instance only has one property with
	// a certain name, Multiple should be true if a struct would best represent
	// it as a field of type []T instead of type T.
	Multiple bool
}

Properti adalah pasangan nama/nilai dan beberapa metadata. Konten entity datastore dimuat dan disimpan sebagai urutan Properti. Sebuah entity dapat memiliki beberapa Properti dengan nama yang sama, asalkan p.Multiple bernilai benar pada semua Properti entity tersebut dengan nama tersebut.

func SaveStruct

func SaveStruct(src interface{}) ([]Property, error)

SaveStruct menampilkan properti dari src sebagai slice dari Properties. src harus berupa pointer struct.

PropertyList

type PropertyList []Property

PropertyList mengonversi []Properti untuk mengimplementasikan PropertyLoadSaver.

func (*PropertyList) Load

func (l *PropertyList) Load(p []Property) error

Load akan memuat semua properti yang disediakan ke l. Load ini tidak terlebih dahulu mereset *l ke slice kosong.

func (*PropertyList) Save

func (l *PropertyList) Save() ([]Property, error)

Save menyimpan semua properti l sebagai slice atau Properti.

PropertyLoadSaver

type PropertyLoadSaver interface {
	Load([]Property) error
	Save() ([]Property, error)
}

PropertyLoadSaver dapat dikonversi dari dan ke slice Properti.

Kueri

type Query struct {
	// contains filtered or unexported fields
}

Kueri mewakili kueri datastore.

func NewQuery

func NewQuery(kind string) *Query

NewQuery membuat Kueri baru untuk jenis entitas tertentu.

Jenis kosong berarti menampilkan semua entity, termasuk entity yang dibuat dan dikelola oleh fitur App Engine lainnya, dan disebut kueri tanpa jenis. Kueri tanpa jenis tidak boleh menyertakan filter atau tata urutan pada nilai properti.

func (*Query) Ancestor

func (q *Query) Ancestor(ancestor *Key) *Query

Ancestor menampilkan kueri turunan dengan filter ancestor. Ancestor tidak boleh bernilai nil.

func (*Query) BatchSize

func (q *Query) BatchSize(size int) *Query

BatchSize menampilkan kueri turunan untuk mengambil jumlah hasil yang disediakan sekaligus. Nilai ini harus lebih besar dari nol, dan sama dengan atau kurang dari Batas.

func (*Query) Count

func (q *Query) Count(c context.Context) (int, error)

Count menampilkan jumlah hasil untuk kueri.

Waktu berjalan dan jumlah panggilan API yang dilakukan oleh Count diskalakan secara linear dengan jumlah offset dan batas kueri. Kecuali jika jumlah hasilnya diperkirakan kecil, sebaiknya tentukan batas; jika tidak, Count akan berlanjut hingga selesai dihitung atau konteks yang diberikan berakhir.

func (*Query) Distinct

func (q *Query) Distinct() *Query

Distinct menampilkan kueri turunan yang menghasilkan entity yang telah dihapus duplikatnya sesuai dengan kumpulan kolom yang diproyeksikan. Ini hanya digunakan untuk kueri proyeksi. Distinct tidak dapat digunakan dengan DistinctOn.

func (*Query) DistinctOn

func (q *Query) DistinctOn(fieldNames string) *Query

DistinctOn menampilkan kueri turunan yang menghasilkan entity yang telah dihapus duplikatnya terkait dengan kumpulan kolom yang ditentukan. Ini hanya digunakan untuk kueri proyeksi. Daftar kolom harus merupakan bagian dari daftar kolom yang diproyeksikan. DistinctOn tidak dapat digunakan dengan Distinct.

func (*Query) End

func (q *Query) End(c Cursor) *Query

End menampilkan kueri turunan dengan titik akhir yang ditentukan.

func (*Query) EventualConsistency

func (q *Query) EventualConsistency() *Query

EventualConsistency menampilkan kueri turunan yang menampilkan hasil yang pada akhirnya konsisten. Ini hanya berpengaruh pada kueri ancestor.

func (*Query) Filter

func (q *Query) Filter(filterStr string, value interface{}) *Query

Filter menampilkan kueri turunan dengan filter berbasis kolom. Argumen filterStr harus berupa nama kolom yang diikuti dengan spasi opsional, diikuti dengan operator, abtara ">", "<", ">=", "<=", atau "=". Kolom dibandingkan dengan nilai yang diberikan menggunakan operator. Beberapa filter digabungkan bersama menggunakan AND.

func (*Query) GetAll

func (q *Query) GetAll(c context.Context, dst interface{}) ([]*Key, error)

GetAll menjalankan kueri dalam konteks tertentu dan menampilkan semua kunci yang cocok dengan kueri tersebut, serta menambahkan nilainya ke dst.

dst harus memiliki jenis []S atau *[]S atau *[]P, untuk beberapa struct jenis S atau beberapa jenis non-antarmuka, jenis P bukan pointer seperti P atau *P mengimplementasikan PropertyLoadSaver.

Sebagai kasus khusus, *PropertyList adalah jenis yang tidak valid untuk dst, meskipun PropertyList adalah slice dari struct. Properti ini diperlakukan sebagai tidak valid agar tidak diteruskan secara tidak sengaja saat yang dimaksud adalah *[]PropertyList.

Kunci yang ditampilkan oleh GetAll akan berkorespondensi 1-1 dengan entity yang ditambahkan ke dst.

Jika q adalah kueri “khusus kunci”, GetAll mengabaikan dst dan hanya menampilkan kunci.

Waktu berjalan dan jumlah panggilan API yang dilakukan oleh GetAll diskalakan secara linear dengan jumlah offset dan batas kueri. Kecuali jika jumlah hasilnya diperkirakan kecil, sebaiknya tentukan batas; jika tidak, GetAll akan berlanjut hingga hasil selesai dikumpulkan atau konteks yang diberikan berakhir.

func (*Query) KeysOnly

func (q *Query) KeysOnly() *Query

KeysOnly menampilkan kueri turunan yang hanya menghasilkan kunci, bukan kunci dan entity. Parameter ini tidak dapat digunakan dengan kueri proyeksi.

func (*Query) Limit

func (q *Query) Limit(limit int) *Query

Limit menampilkan kueri turunan yang memiliki batas jumlah hasil yang ditampilkan. Nilai negatif berarti tidak terbatas.

func (*Query) Offset

func (q *Query) Offset(offset int) *Query

Offset menampilkan kueri turunan yang memiliki offset jumlah kunci yang harus dilewati sebelum hasil bisa ditampilkan. Nilai negatif tidak valid.

func (*Query) Order

func (q *Query) Order(fieldName string) *Query

Order mengembalikan kueri turunan dengan tata urutan berbasis kolom. Order diterapkan sesuai dengan urutan penambahannya. Urutan defaultnya adalah menaik; untuk mengurutkan dalam urutan menurun, beri awalan fieldName dengan tanda minus (-).

func (*Query) Project

func (q *Query) Project(fieldNames string) *Query

Project menampilkan kueri turunan yang hanya menghasilkan kolom tertentu. Tidak dapat digunakan dengan KeysOnly.

func (*Query) Run

func (q *Query) Run(c context.Context) *Iterator

Run menjalankan kueri dalam konteks yang ditentukan.

func (*Query) Start

func (q *Query) Start(c Cursor) *Query

Start menampilkan kueri turunan dengan titik awal yang ditentukan.

TransactionOptions

type TransactionOptions struct {
	// XG is whether the transaction can cross multiple entity groups. In
	// comparison, a single group transaction is one where all datastore keys
	// used have the same root key. Note that cross group transactions do not
	// have the same behavior as single group transactions. In particular, it
	// is much more likely to see partially applied transactions in different
	// entity groups, in global queries.
	// It is valid to set XG to true even if the transaction is within a
	// single entity group.
	XG bool
	// Attempts controls the number of retries to perform when commits fail
	// due to a conflicting transaction. If omitted, it defaults to 3.
	Attempts int
	// ReadOnly controls whether the transaction is a read only transaction.
	// Read only transactions are potentially more efficient.
	ReadOnly bool
}

TransactionOptions adalah opsi untuk menjalankan transaksi.