Python 2.7 telah mencapai akhir dukungan
dan akan dihentikan penggunaannya
pada 31 Januari 2026. Setelah penghentian penggunaan, Anda tidak akan dapat men-deploy aplikasi Python 2.7, meskipun organisasi Anda sebelumnya menggunakan kebijakan organisasi untuk mengaktifkan kembali deployment runtime lama. Aplikasi Python 2.7 yang ada akan terus berjalan dan menerima traffic setelah
tanggal penghentiannya. Sebaiknya Anda bermigrasi ke versi Python terbaru yang didukung.
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Setiap entity diidentifikasi oleh kunci yang unik dalam instance
Datastore aplikasi, dan terdiri dari ID berikut:
jenis. Jenis biasanya merupakan nama class model tempat entity berada, tetapi Anda dapat mengubahnya menjadi beberapa string lain dengan mengganti classmethod _get_kind().
ID. Anda menentukan nama kunci Anda sendiri sebagai ID atau biarkan Datastore menghasilkan ID numerik bilangan bulat secara otomatis.
Menentukan nama kunci Anda sendiri
Contoh berikut secara implisit membuat kunci dengan ID string menggunakan parameter bernama id:
Atau, Anda dapat menetapkan nama kunci secara langsung:
account.key=ndb.Key('Account','sandy@example.com')# You can also use the model class object itself, rather than its name,# to specify the entity's kind:account.key=ndb.Key(Account,'sandy@example.com')
Mengizinkan Datastore membuat ID untuk digunakan sebagai kunci
Kode ini menunjukkan cara menggunakan ID yang dibuat secara otomatis sebagai kunci:
# note: no id kwargaccount=Account(username='Sandy',userid=1234,email='sandy@example.com')account.put()# account.key will now have a key of the form: ndb.Key(Account, 71321839)# where the value 71321839 was generated by Datastore for us.
Menggunakan jalur ancestor dalam kunci
Urutan entity yang dimulai dengan root entity dan berlanjut dari induk
ke turunan, yang mengarah ke entity tertentu, merupakan jalur ancestor entity tersebut.
Secara rekursif, suatu entity, induknya, induk dari induknya, dan seterusnya merupakan ancestor entity. Entity dalam Datastore membentuk ruang kunci hierarkis yang mirip dengan struktur direktori hierarkis pada sistem file.
Kunci lengkap yang mengidentifikasi
entity terdiri dari urutan pasangan jenis-ID yang menentukan
jalur ancestor-nya dan berakhir dengan entity itu sendiri. Metode konstruktor untuk class Key menerima urutan jenis dan
ID tersebut, serta menampilkan objek yang mewakili kunci untuk entity yang sesuai.
Contoh berikut menunjukkan layanan blogging yang menyimpan pesan berdasarkan revisi.
Pesan diatur dalam akun, dan revisi diatur dalam pesan.
Dalam contoh, ('Account', 'sandy@example.com'), ('Message', 123), dan ('Revision', '1')
adalah contoh pasangan jenis-ID.
Perhatikan bahwa Message bukan class model dan hanya digunakan sebagai cara untuk
mengelompokkan revisi, bukan untuk menyimpan data.
Seperti yang ditunjukkan dalam kode contoh, jenis entity ditentukan oleh pasangan nama-jenis terakhir
dalam daftar: ndb.Key('Revision', '1').
Menggunakan parameter bernama
Anda dapat menggunakan parameter bernama parent untuk menentukan entity apa pun di jalur ancestor secara langsung. Semua notasi berikut mewakili kunci yang sama:
Untuk root entity, jalur ancestor kosong dan kuncinya hanya terdiri dari jenis dan ID entity itu sendiri.
sandy_key=ndb.Key(Account,'sandy@example.com')
Menentukan entity dengan ancestor
Untuk menyisipkan pesan baru dengan kunci induk
account_key=ndb.Key(Account,'sandy@example.com')# Ask Datastore to allocate an ID.new_id=ndb.Model.allocate_ids(size=1,parent=account_key)[0]# Datastore returns us an integer ID that we can use to create the message# keymessage_key=ndb.Key('Message',new_id,parent=account_key)# Now we can put the message into Datastoreinitial_revision=Revision(message_text='Hello',id='1',parent=message_key)initial_revision.put()
Untuk kunci yang dibuat dengan suatu induk, metode parent() akan menampilkan kunci
yang mewakili parent entity:
message_key=initial_revision.key.parent()
Menggunakan ID Kunci Numerik
Anda dapat membuat entity tanpa menentukan ID, dalam hal ini penyimpanan data
akan otomatis menghasilkan ID numerik. Jika Anda memilih untuk menentukan beberapa ID lalu mengizinkan Datastore membuat beberapa ID secara otomatis, Anda dapat melanggar persyaratan untuk kunci unik. Untuk menghindari hal ini, cadangkan rentang angka yang akan digunakan untuk memilih ID atau gunakan ID string untuk menghindari masalah ini sepenuhnya.
Untuk mencadangkan rentang ID, gunakan metode class allocate_ids():
untuk mengalokasikan ID dalam jumlah tertentu
untuk mengalokasikan semua ID hingga nilai maksimum yang ditentukan.
Mengalokasikan ID
Untuk mengalokasikan 100 ID ke class model MyModel tertentu:
first,last=MyModel.allocate_ids(100)
Untuk mengalokasikan 100 ID ke entity dengan kunci induk p:
first,last=MyModel.allocate_ids(100,parent=p)
Nilai yang ditampilkan, first dan last, adalah ID pertama dan terakhir (inklusif)
yang dialokasikan. Anda dapat menggunakan ini untuk membuat kunci seperti berikut:
Kunci ini dijamin tidak akan ditampilkan sebelumnya oleh generator ID internal penyimpanan data, dan tidak akan ditampilkan oleh panggilan mendatang ke generator ID internal. Namun, metode allocate_ids() tidak memeriksa
apakah ID yang ditampilkan ada di penyimpanan data; metode ini hanya berinteraksi
dengan generator ID.
Untuk mengalokasikan semua ID hingga nilai maksimum yang ditentukan:
first,last=MyModel.allocate_ids(max=N)
Formulir ini memastikan bahwa semua ID yang kurang dari atau sama dengan N dianggap
telah dialokasikan. Nilai yang ditampilkan, first dan last, menunjukkan rentang ID yang dicadangkan oleh operasi ini. Mencoba mencadangkan ID yang sudah dialokasikan bukanlah suatu kesalahan; jika terjadi, first menunjukkan ID pertama yang belum dialokasikan dan
last adalah ID terakhir yang dialokasikan.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Sulit dipahami","hardToUnderstand","thumb-down"],["Informasi atau kode contoh salah","incorrectInformationOrSampleCode","thumb-down"],["Informasi/contoh yang saya butuhkan tidak ada","missingTheInformationSamplesINeed","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 2025-09-04 UTC."],[[["\u003cp\u003eEntities in the Datastore are uniquely identified by a key, which includes a kind and an identifier, either specified by the user or automatically generated by Datastore.\u003c/p\u003e\n"],["\u003cp\u003eThe key identifier can be a string, set by the user, or an integer ID, automatically generated by Datastore, which can be chosen by either setting an \u003ccode\u003eid\u003c/code\u003e parameter or letting it be generated upon using \u003ccode\u003eput\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eEntities can have an ancestor path, forming a hierarchical structure similar to a file system, where the complete key includes a sequence of kind-identifier pairs representing the entity and its ancestors.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eallocate_ids()\u003c/code\u003e method can be used to reserve a range of numeric IDs for a specific model, ensuring unique key creation, and this can be done either by specifying a number of ID's or a max number.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eparent\u003c/code\u003e named parameter can be used to designate any entity in the ancestor path directly, offering flexibility in defining entity relationships and key structures.\u003c/p\u003e\n"]]],[],null,["# Creating and Using Entity Keys\n\n| This API is supported for first-generation runtimes and can be used when [upgrading to corresponding second-generation runtimes](/appengine/docs/standard/\n| python3\n|\n| /services/access). If you are updating to the App Engine Python 3 runtime, refer to the [migration guide](/appengine/migration-center/standard/migrate-to-second-gen/python-differences) to learn about your migration options for legacy bundled services.\n\nEach entity is identified by a key that is unique within the application's\nDatastore instance, and consists of the following:\n\n- **kind** . The kind is normally the name of the model class to which the entity belongs, but you can change this to some other string by overriding the classmethod `_get_kind()`.\n- **identifier** . You specify your own *key name* as the identifier or let Datastore automatically generate an integer numeric ID.\n\nSpecifying your own key name\n----------------------------\n\nThe following example implicitly creates a key with a string identifier\nusing the named parameter `id`: \n\n account = Account(\n username='Sandy', userid=1234, email='sandy@example.com',\n id='sandy@example.com')\n\n return account.key.id() # returns 'sandy@example.com'\n\nYou could alternatively set the key name directly: \n\n account.key = ndb.Key('Account', 'sandy@example.com')\n\n # You can also use the model class object itself, rather than its name,\n # to specify the entity's kind:\n account.key = ndb.Key(Account, 'sandy@example.com')\n\nLetting Datastore generate an ID to use for the key\n---------------------------------------------------\n\nThis code shows how to use an auto-generated ID as the key: \n\n # note: no id kwarg\n account = Account(username='Sandy', userid=1234, email='sandy@example.com')\n account.put()\n # account.key will now have a key of the form: ndb.Key(Account, 71321839)\n # where the value 71321839 was generated by Datastore for us.\n\nUsing the ancestor path in the key\n----------------------------------\n\nThe sequence of entities beginning with a root entity and proceeding from parent\nto child, leading to a given entity, constitute that entity's *ancestor path* .\nAn entity, its parent, parent's parent, and so on recursively, are the entity's\n*ancestors*. The entities in Datastore form a hierarchical key space\nsimilar to the hierarchical directory structure of a file system.\n\nThe complete key identifying an entity consists of a sequence of kind-identifier\npairs specifying its ancestor path and terminating with those of the entity\nitself. The constructor method for class `Key` accepts such a sequence of kinds and\nidentifiers and returns an object representing the key for the corresponding entity.\n\nThe following example shows a blogging service that stores messages by revision.\nMessages are organized under accounts, and revisions are under messages.\n\n\n class Revision(ndb.Model):\n message_text = ndb.StringProperty()\n\n`...` \n\n ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')\n ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '2')\n ndb.Key('Account', 'larry@example.com', 'Message', 456, 'Revision', '1')\n ndb.Key('Account', 'larry@example.com', 'Message', 789, 'Revision', '2')\n\nIn the sample, `('Account', 'sandy@example.com')`, `('Message', 123)`, and `('Revision', '1')`\nare all examples of kind-identifier pairs.\n\nNotice that `Message` is not a model class; it is used only as a way to group\nrevisions, not to store data.\n\nAs shown in the sample code, the entity's kind is designated by the *last*\nkind-name pair in the list: `ndb.Key('Revision', '1')`.\n\n### Using named parameters\n\nYou can use the named parameter `parent` to designate any entity in the ancestor\npath directly. All of the following notations represent the same key: \n\n ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')\n\n ndb.Key('Revision', '1', parent=ndb.Key(\n 'Account', 'sandy@example.com', 'Message', 123))\n\n ndb.Key('Revision', '1', parent=ndb.Key(\n 'Message', 123, parent=ndb.Key('Account', 'sandy@example.com')))\n\n### Specifying a root entity\n\nFor a root entity, the ancestor path is empty and the key consist solely of the\nentity's own kind and identifier. \n\n sandy_key = ndb.Key(Account, 'sandy@example.com')\n\n### Specifying an entity with ancestors\n\nTo insert a new message with parent keys \n\n account_key = ndb.Key(Account, 'sandy@example.com')\n\n # Ask Datastore to allocate an ID.\n new_id = ndb.Model.allocate_ids(size=1, parent=account_key)[0]\n\n # Datastore returns us an integer ID that we can use to create the message\n # key\n message_key = ndb.Key('Message', new_id, parent=account_key)\n\n # Now we can put the message into Datastore\n initial_revision = Revision(\n message_text='Hello', id='1', parent=message_key)\n initial_revision.put()\n\nFor keys that were created with a parent, the `parent()` method returns a key\nrepresenting the parent entity: \n\n message_key = initial_revision.key.parent()\n\nUsing Numeric Key IDs\n---------------------\n\nYou can create an entity without specifying an ID, in which case the data store\nautomatically generates a numeric ID. If you choose to specify some IDs and then\nlet Datastore automatically generate some IDs, you could\nviolate the requirement for unique keys. To avoid this, reserve a range of\nnumbers to use to choose IDs or use string IDs to avoid this issue entirely.\n\nTo reserve a range of IDs, use the model class'\n[`allocate_ids()`](/appengine/docs/legacy/standard/python/ndb/modelclass#Model_allocate_ids)\nclass method:\n\n- to allocate a specified number of IDs\n- to allocate all IDs up to a given maximum value.\n\n### Allocating IDs\n\nTo allocate 100 IDs for a given model class `MyModel`: \n\n first, last = MyModel.allocate_ids(100)\n\nTo allocate 100 IDs for entities with parent key `p`: \n\n first, last = MyModel.allocate_ids(100, parent=p)\n\nThe returned values, `first` and `last`, are the first and last IDs (inclusive)\nthat are allocated. You can use these to construct keys as follows: \n\n keys = [ndb.Key(MyModel, id) for id in range(first, last+1)]\n\nThese keys are guaranteed not to have been returned previously by the data\nstore's internal ID generator, nor will they be returned by future calls to the\ninternal ID generator. However, the `allocate_ids()` method does not check\nwhether the IDs returned are present in the data store; it only interacts with\nthe ID generator.\n\nTo allocate all IDs up to a given maximum value: \n\n first, last = MyModel.allocate_ids(max=N)\n\nThis form ensures that all IDs less than or equal to `N` are considered\nallocated. The return values, `first` and `last`, indicate the range of IDs\nreserved by this operation. It is not an error to attempt to reserve IDs already\nallocated; if that happens, `first` indicates the first ID not yet allocated and\n`last` is the last ID allocated.\n| **Note:** you cannot call `allocate_ids()` in a [transaction](/appengine/docs/legacy/standard/python/ndb/transactions)."]]